2013-08-18 19 views
6

Immagino che questo dovrebbe essere abbastanza facile da rispondere, se comprendi XML Layout meglio di quello che faccio. Non riesco a ottenere quello che stavo pensando che dovrei usare quando si utilizza lo match_parent layout_height.match_parent che non funziona come previsto

Ho un LinearLayout elemento radicolare con android: orientation = "verticale". All'interno di questo LinearLayout voglio tre elementi: - TextView - ListView - TextView

Per entrambi i TextViews ho impostato android: layout_height = "wrap_content" in modo che essi saranno solo alto come è necessario per visualizzare il loro contenuto. Il fatto è che voglio che l'unico TextView sia posizionato nella parte superiore del modulo, l'altro da sedersi nella parte inferiore del modulo mentre il ListView riempie tutto lo spazio disponibile nel modulo. Così qui è quello che il mio layout xml assomiglia:

<TextView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:textSize="30sp" 
    android:text="Top TextView" /> 

<ListView 
    android:id="@+id/listView_Species" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

<TextView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:textSize="30sp" 
    android:text="Bottom TextView" /> 

Ma non funziona. Ecco cosa ricevo. Ho selezionato ListView in modo che sia evidenziato. Si noti come si estende fino alla fine del modulo, spingendo il TextView in basso fuori dal modulo. XML Layout 1

Quando cambio la proprietà layout_height di ListView su un valore fisso, come 180dp, questo è l'aspetto del modulo. Sto solo postando questo per dimostrare che il TextView in basso è lì, ma non so ancora come farlo rimettere in fondo allo schermo mentre il ListView occupa tutto lo spazio rimanente, ma tra le due TextViews.

XML Layout 2

Grazie in anticipo.

risposta

7

Mentre le altre risposte tentare di risolvere il problema (che non in realtà - suggeriscono che fate qualcosa che sembra simile a ma potrebbe non avere un bell'aspetto su dispositivi diversi), nessuno ha colmato le lacune nella conoscenza di LinearLayouts e match_parent. E queste lacune sono molto comuni - la documentazione di Google è ancora molto al di sotto di quella stellare.

In primo luogo, come funzionano le viste all'interno di un LinearLayout? Esaminiamo il processo di disegno di un LinearLayout, utilizzando orientation="vertical" per semplicità.

  1. Esaminare l'altezza del primo figlio del LinearLayout (LL in breve). Se l'altezza è match_parent o fill_parent (vecchio nome per la stessa cosa), l'altezza della vista viene allungata per riempire l'intera area di visualizzazione. Se l'altezza è wrap_content, misurare lo spazio verticale preso dalla vista e utilizzare quello spazio per la vista. Se l'altezza è un numero diverso da zero, utilizza esattamente tanti pixel per l'altezza della vista (potrebbe tagliarsi se è troppo piccola). Se l'altezza è 0 vedi sotto.
  2. Inserire la vista successiva sotto la vista in 1. Verificare l'altezza e agire di conseguenza.
  3. Continua per tutte le visualizzazioni. Se una vista viene spostata dal basso, andare avanti e interrompere il calcolo perché nessuno lo vedrà o nessuna vista successiva (supponendo ScrollView).
  4. Se l'altezza di una vista è 0, controllare che sia gravity. Ciò richiede un secondo passaggio, memorizzando la gravità di tutte le viste e quindi assegnando le loro altezze in modo proporzionale. Come puoi immaginare, la seconda passata raddoppia il tempo impiegato dal layout, che non è significativo per i layout semplici.

Spiegazione del vostro esempio: Il primo bambino della LL (il primo TextView) viene misurata e richiede una certa quantità di pixel. Quindi il tuo ListView prende tutto lo spazio rimanente (via match_parent). E poi la tua seconda TextView non viene disegnata affatto poiché si trova nella parte inferiore dello schermo. Che è più o meno quello che hai osservato, ma ora capisci perché.

Soluzione: Utilizzare RelativeLayout. Funziona perfettamente in questo caso.

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <TextView 
     android:id="@+id/top_tv" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:textSize="30sp" 
     android:text="Top TextView" /> 

    <TextView 
     android:id="@+id/bottom_tv" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:textSize="30sp" 
     android:text="Bottom TextView" /> 

    <ListView 
     android:id="@+id/listView_Species" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_below="@id/top_tv" 
     android:layout_above="@id/bottom_tv" 
     /> 
</RelativeLayout> 

Il RelativeLayout dice il gonfiatore di layout per disegnare il primo TextView in alto, quindi disegnare la seconda TextView in fondo, e quindi riempire il resto dello spazio con il vostro ListView. Credo che questo sia esattamente quello che vuoi.

Benvenuti in Android. Userai questo modello MOLTO!

3

utilizzare android: layout_weight per definire i pesi dei widget all'interno del layout più esterno. Dichiarare la loro altezza come 0dp e quindi definire android:layout_weight in ognuno di essi. La somma totale dei tre deve essere 1. In base alle proprie esigenze è possibile definire il peso 0.1 in entrambi i TextView in alto e in basso e definire 0.8 in ListView.

<TextView 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight = "0.1" 
    android:textSize="30sp" 
    android:text="Top TextView" /> 

<ListView 
    android:id="@+id/listView_Species" 
    android:layout_width="match_parent" 
    android:layout_weight = "0.8" 
    android:layout_height="0dp" /> 

<TextView 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:textSize="30sp" 
    android:layout_weight = "0.1" 
    android:text="Bottom TextView" /> 
+0

Sto inviando la tua risposta, ma non mi dà esattamente quello che volevo. Ciò fa sì che TextView sia esteso anche a una determinata percentuale delle dimensioni dello schermo. Voglio che vengano riparati mentre solo il ListView si estende per occupare lo spazio rimanente. Royi sopra, ha pubblicato la soluzione per questo. –

11

Cambiare l'altezza ListView per 0DP e aggiungere weight=1
cioè:

<TextView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:textSize="30sp" 
    android:text="Top TextView" /> 

<ListView 
    android:id="@+id/listView_Species" 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight="1" /> 

<TextView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:textSize="30sp" 
    android:text="Bottom TextView" /> 
+0

Questo per una spiegazione. Sospiro. –

Problemi correlati