2014-09-29 26 views
5

Nel mio LinearLayout orizzontale, ho impostato la gravità in una vista per essere center_vertical, quindi ho provato a impostare layout_gravity per una seconda vista, ma quella vista è allineata con il testo centrato nella prima vista!Impostazione del baricentro della vista figlio cambia l'allineamento del layout di un'altra vista secondaria nel layout orizzontale?

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" > 
    <TextView 
     android:layout_width="100dp" 
     android:layout_height="200dp" 
     android:layout_gravity="top" 
     android:background="@drawable/border" 
     android:gravity="center_vertical" 
     android:text="layout_gravity=top gravity=center_vertical" > 
    </TextView>    
    <TextView 
     android:layout_width="100dp" 
     android:layout_height="200dp" 
     android:layout_gravity="top" 
     android:background="@drawable/border" 
     android:gravity="top" 
     android:text="layout_gravity=top gravity=top" > 
    </TextView> 
</LinearLayout> 

enter image description here

E qui è lo stesso codice, ma per un layout verticale. Si noti che il comportamento desiderato funziona correttamente nel layout verticale.

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 
    <TextView 
     android:layout_width="200dp" 
     android:layout_height="100dp" 
     android:layout_gravity="left" 
     android:background="@drawable/border" 
     android:gravity="center_horizontal" 
     android:text="layout_gravity=left gravity=center_horizontal" > 
    </TextView>    
    <TextView 
     android:layout_width="200dp" 
     android:layout_height="100dp" 
     android:layout_gravity="right" 
     android:background="@drawable/border" 
     android:gravity="right" 
     android:text="layout_gravity=right gravity=right" > 
    </TextView> 
</LinearLayout> 

enter image description here

posso solo usare un RelativeLayout o forse un altro LinearLayout nidificato per risolvere il problema. Ma sto facendo questa domanda perché vorrei sapere se non capisco quanto gravity e layout_gravity funzionino !! Per me è importante capire come funzionano questi attributi fondamentali. Grazie

risposta

7

Se si desidera uno centrato e quello superiore, allora avete bisogno di aggiungere un flag di base allineata LinearLayout

android:baselineAligned="false" 

È l'impostazione predefinita per allineare le linee di base dei bambini. Questo può causare problemi come questo quando i bambini usano diversi valori di gravità.

La differenza con verticale è che le linee di base non possono essere allineate come possono in orizzontale.

See:

http://developer.android.com/reference/android/widget/LinearLayout.html#attr_android:baselineAligned

Ulteriori informazioni - Questo sembra spiegare il problema meglio di me:

http://www.doubleencore.com/2013/10/shifty-baseline-alignment/

+0

così fantastico. Grazie!! stavo impazzendo –

+0

+1. Non ne ero a conoscenza. –

+0

Interessante. Ho imparato qualcosa di nuovo :) – Karakuri

0

gravity è come la vista stessa posiziona il suo contenuto all'interno dell'area determinata dalla sua larghezza e altezza. layout_gravity è il modo in cui la vista genitore posiziona il bambino all'interno dell'area del genitore. Di solito puoi semplicemente impostare gravity su LinearLayout invece di impostare layout_gravity su tutti i suoi figli.

Si noti che per LinearLayouts, gravity ha solo un effetto sull'asse che non è l'orientamento, ad es. superiore e inferiore sarebbero rilevanti per un LinearLayout orizzontale, ma sinistra e destra (o inizio e fine) non sarebbero rilevanti.

+0

Il secondo TextView nel primo esempio ha layout_gravity = "top" . È genitore il LinearLayout orizzontale. Perché la parte superiore del TextView figlio non è allineata con la parte superiore del LinearLayout principale? –

0

se si sta cercando qualcosa che non "connessi gli uni agli altri", cioè si vuole un po 'di spazio tra due widget quindi utilizzare un widget e sull'uso vuote pesi

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="horizontal" 
android:weightSum="100" > 

<TextView 
    android:layout_width="100dp" 
    android:layout_height="200dp" 

    android:layout_weight="40" 
    android:gravity="center_vertical" 
    android:text="layout_gravity=top gravity=center_vertical" > 
</TextView> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_weight="20" /> 

<TextView 
    android:layout_width="100dp" 
    android:layout_height="200dp" 

    android:layout_weight="40" 
    android:gravity="right" 
    android:text="layout_gravity=top gravity=top" > 
</TextView> 

</LinearLayout> 

Main Answer Image

werent chiaro circa l'uscita che volevi, questo è quello che potrei interpretare come output richiesto .. Ma ti spiegherò come funziona .. Per ulteriori informazioni sui pesi puoi andare a http://developer.android.com/reference/android/widget/package-summary.html

s qualcosa chiamato "widget" e "contenuto del widget" Parlando di linearlayout con layout_gravity si imposta la gravità di sé come un "widget" nella vista principale e con gravità si imposta gravità per il contenuto in questo linearlayout

Similmente con la visualizzazione di testo, se si utilizza layout_gravity (ad esempio uguale al centro), la visualizzazione del testo sarà centrata nello spazio (es.sia centrata alla larghezza se layoutorientation è verticale, e sarà centrata in altezza se layout_orientation è orizzontale)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="horizontal"> 

<TextView 
    android:layout_width="200dp" 
    android:layout_height="200dp" 
    android:layout_gravity="center" 
    android:text="Second Activity" /> 



</LinearLayout> 

Horizontal linear_layout

Vedi lo stesso orientamento verticale

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 

<TextView 
    android:layout_width="200dp" 
    android:layout_height="200dp" 
    android:layout_gravity="center" 
    android:text="Second Activity" /> 

</LinearLayout> 

Vertical Linear Layout

Ora si può anche vedere la gravità quando si applica la gravità per TextView, il "testo" nel TextView è centrato (se la gravità = centro)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 

<TextView 
    android:layout_width="200dp" 
    android:layout_height="200dp" 
    android:layout_gravity="center" 
    **android:gravity="center"** 
    android:text="Second Activity" /> 

</LinearLayout> 

centerTextVertical

Ora è possibile rendersi conto che gravità imposta la gravità per il contenuto all'interno della widget .. il "contenuto" di un widget può essere widget stesso. LinearLayout è un widget, e all'interno di un layout lineare si aggiungono altri tipi di widget (vista pulsante e testo) Quindi applicare gravità = centro a vista testo imposta il suo contenuto (vale a dire testo) al centro e la gravità applicando al LinearLayout sarà centrare il suo contenuto (cioè TextView) al centro

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
android:gravity="center"> 

<TextView 
    android:layout_width="200dp" 
    android:layout_height="200dp" 
    android:layout_gravity="center" 
    android:gravity="center" 
    android:text="Second Activity" /> 

</LinearLayout> 

layout_gravity_center