2013-06-10 8 views
10

Sto provando a creare una linearlay verticale con pesi di dimensioni maggiori rispetto allo schermo. Diciamo 2x la dimensione dello schermo. Affinché questo funzioni, ovviamente, dovrei essere in grado di scorrerlo. Purtroppo non riesco a capire un modo per farlo. Ho provato a usare i pesi del layout e impostare la somma del peso come metà della somma effettiva dei pesi di tutti i componenti (quindi se tutti i componenti pesano la somma è 20 ho impostato il peso come 10) e sono riuscito a farlo funzionare ma sfortunatamente il lo scorrimento non funziona più per qualche motivo.linearlaylayout scorrevole con pesi più grandi di schermo in Android

C'è qualcosa che mi manca?

questo è il codice che rende la LinearLayout due volte più grande come lo schermo, ma il rotolo non funziona:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    android:fillViewport="true"> 

    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:weightSum="2"> 

     <EditText android:id="@+id/id1" 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:textSize="25dp" 
      android:gravity="center" 
      android:layout_weight="2"/> 

     <EditText android:id="@+id/id2" 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:textSize="25dp" 
      android:gravity="center" 
      android:layout_weight="2"/> 

    </LinearLayout> 
</ScrollView> 

risposta

7

In base al tuo commento, ecco un modo programmatico per ottenere ciò che stai cercando. Non credo che ci sia un modo per farlo in puro XML di layout.

Disposizione:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="center_horizontal" 
    android:background="#000000" 
    android:fillViewport="true" > 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="#FFFFFF" 
     android:orientation="vertical" > 

     <EditText 
      android:id="@+id/id1" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:background="#DCDCDC" 
      android:gravity="center" 
      android:text="ONE ONE ONE" 
      android:textIsSelectable="false" 
      android:textSize="45sp" /> 

     <EditText 
      android:id="@+id/id2" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:background="#AAAAAA" 
      android:gravity="center" 
      android:text="TWO TWO TWO" 
      android:textIsSelectable="false" 
      android:textSize="45sp" /> 

     <EditText 
      android:id="@+id/id3" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:background="#777777" 
      android:gravity="center" 
      android:text="THREE THREE THREE" 
      android:textIsSelectable="false" 
      android:textSize="45sp" /> 
    </LinearLayout> 

</ScrollView> 

attività:

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     // Get display size -- API L13 and up. Otherwise use getResources().getDisplayMetrics(); 
     Display display = getWindowManager().getDefaultDisplay(); 
     Point size = new Point(); 
     display.getSize(size); 


     // You want size to be 50% per EditText, so divide available height by 2. 
     // Note: this is absolute height, does not take into consideration window decoration! 
     int editTextHeight = size.y/2; 

     // Get a handle to your EditTexts 
     EditText t1 = (EditText) findViewById(R.id.id1); 
     EditText t2 = (EditText) findViewById(R.id.id2); 
     EditText t3 = (EditText) findViewById(R.id.id3); 

     // Set height to 50% of screen size each 
     t1.setHeight(editTextHeight); 
     t2.setHeight(editTextHeight); 
     t3.setHeight(editTextHeight); 
} 

Che faremo.Risultato finale:

EditText 50% screen height EditText 50% screen height EditText 50% screen height

+2

grazie per la risposta. Sapevo come farlo in modo programmatico, ma comunque valeva la pena anche solo per aver confermato che non si può fare in puro xml –

1

Il problema qui è l'utilizzo del layout_weight e weightSum non è valido. È importante ricordare che lo android:layout_weight può utilizzare solo lo spazio disponibile nella vista; qualsiasi cosa che superi questo limite viene automaticamente ritagliata.

Pertanto, nel tuo esempio, il tuo primo EditText occupa interamente lo schermo e il tuo secondo è completamente escluso dalla vista. Poiché il secondo EditText è ritagliato, lo LinearLayout ha occupato l'intero schermo e non c'è nulla da fare per lo ScrollView.

Non sono del tutto sicuro di quale sia il tuo obiettivo finale; stai provando ad avere input di testo che crescono con la voce dell'utente e il ScrollView gestisce l'overflow?

Se è così, questo funzionerà:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="center_horizontal" 
    android:background="#000000" 
    android:fillViewport="true" > 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="#FFFFFF" 
     android:orientation="vertical" > 

     <EditText 
     android:id="@+id/id1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="#DCDCDC" 
     android:gravity="center" 
     android:text="ONE ONE ONE" 
     android:textIsSelectable="false" 
     android:textSize="45sp" /> 

    <EditText 
     android:id="@+id/id2" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="#AAAAAA" 
     android:gravity="center" 
     android:text="TWO TWO TWO" 
     android:textIsSelectable="false" 
     android:textSize="45sp" /> 
    </LinearLayout> 

</ScrollView> 

ho incluso alcuni colori di sfondo di base in modo da poter vedere dove ogni elemento inizia & finisce nel layout di anteprima. Digitando il primo EditText si spinge correttamente il secondo verso il basso, producendo una barra di scorrimento.

Si noti inoltre che è necessario utilizzare sp anziché dp per i valori textSize.

Modifica: Devo anche notare, per chiarimenti, che weightSum anche toglie lo spazio quando necessario. Per verificare ciò, impostare lo su 2, weightSum e quindi aggiungere android:layout_weight="1" a ciascuno dei controlli EditText. Il risultato finale sarà una divisione 50/50 quando la vista viene caricata, e quindi quando inizi a digitare il primo controllo, il secondo spazio si ridurrà di conseguenza. L'aggiunta di testo al secondo controllo comporterà l'apparizione di una barra di scorrimento.

+0

Ciao. Grazie per la risposta. Fondamentalmente, in una frase, un buon esempio di ciò che sto cercando di ottenere è avere 3 visualizzazioni testuali, ognuna con dimensione 1/2 della dimensione dello schermo. Ciò significa che il 2 verrebbe visualizzato sullo schermo e il terzo verrebbe visualizzato solo quando si scorre verso il basso. –

+1

Non c'è modo di farlo in puro XML; dovresti misurare lo schermo e impostare l'altezza della vista nel codice. Posso fornire un campione per te. –

+0

@sakiskaliakoudas per cui si desidera impostare set layout_height come 0dp e leyout_weight come 0,5 –

3

È dichiarato altezza del vostro LinearLayout "match_parent" che è uguale alla sua altezza genitori. Non scorrerà mai finché il contenuto è più grande di ScrollView. Prima di tutto devi dare un'altezza fissa come (50dp) o wrap_content o devi impostare la sua altezza a livello di programmazione (come l'altezza dello schermo 2x come dici tu).

weightSum e weight imporranno sempre i tuoi articoli per adattarsi alle dimensioni correnti dello LinearLayouts, quindi cerca di non utilizzarlo.

Spero che questo aiuti.

Problemi correlati