2014-09-29 33 views
5

W moim poziomym LinearLayout ustawiłem grawitację w jednym widoku na center_vertical, a następnie spróbowałem ustawić layout_gravity na drugi widok, ale ten widok jest wyrównany z wyśrodkowanym tekstem w pierwszym widoku!Ustawianie środka ciężkości układu podrzędnego powoduje zmianę układu układu w widoku innego podrzędnego w układzie poziomym?

<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

I tu jest ten sam kod, ale dla pionowego układu. Należy zauważyć, że pożądane zachowanie działa poprawnie w układzie pionowym.

<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

mogę po prostu użyć RelativeLayout czy może inny zagnieżdżona LinearLayout aby rozwiązać problem. Ale zadaję to pytanie, ponieważ chciałbym wiedzieć, czy nie rozumiem, jak działa gravity i layout_gravity !! Ważne jest dla mnie zrozumienie, jak działają te podstawowe cechy. Dzięki

Odpowiedz

7

Jeśli chcesz jeden scentralizowany i jeden wierzchołek to trzeba dodać bazowego wyrównane flagę do LinearLayout

android:baselineAligned="false" 

Domyślnie układ dopasowuje linie podstawowe dla dzieci. Może to powodować takie problemy, gdy dzieci używają różnych wartości grawitacji.

Różnica w pionie polega na tym, że linii podstawowych nie można wyrównać w poziomie.

Patrz:

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

Dodatkowe info - Wydaje się to wyjaśnić problem lepiej niż ja:

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

+0

tak niesamowite. dzięki!! szaleję. –

+0

+1. Nie wiedziałem o tym. –

+0

Interesujące. Nauczyłem się czegoś nowego :) – Karakuri

0

gravity to sposób, w jaki sam widok umieszcza swoją zawartość w obszarze określonym przez jego szerokość i wysokość. layout_gravity to sposób, w jaki widok nadrzędny ustawia dziecko w obszarze macierzystym. Zwykle wystarczy ustawić gravity na LinearLayout zamiast ustawić layout_gravity na wszystkich swoich elementach podrzędnych.

Należy zauważyć, że w przypadku LinearLayouts tylko gravity ma wpływ na oś, która nie jest orientacją, np. górny i dolny byłby odpowiedni dla poziomego LinearLayout, ale lewy i prawy (lub początek i koniec) nie byłyby istotne.

+0

Drugi TextView w pierwszym przykładzie ma layout_gravity = "top" . Jego rodzicem jest poziomy LinearLayout. Dlaczego wierzchołek podrzędny TextView nie jest wyrównany z górną częścią liniowego LinearLayout? –

0

jeśli próbujesz coś nie „połączone ze sobą”, czyli chcesz trochę miejsca między dwoma widgetów następnie użyć pustego widget i stosowanie wagi

<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

Ty nie były jasne, o wyjściu co chciałeś, to mogę zinterpretować jako wymaganą wydajność. Ale wyjaśnię Ci, jak to działa. Więcej informacji na temat ciężarów można znaleźć pod numerem http://developer.android.com/reference/android/widget/package-summary.html

. s coś, co nazywa się "widgetem" i "treścią widżetu" Mówiąc o linearlayout z layout_gravity ustawiasz grawitację jako "widżet" w Widoku głównym i ustawiasz grawitację na treść w tym widoku. linelayout

Podobnie jak w przypadku poglądu tekstowego, jeśli użyjesz layout_gravity (powiedzmy równe środkowi), to widok tekstowy zostanie wyśrodkowany w jego przestrzeni (tj.Będzie ono w swojej szerokości Jeśli layoutorientation jest pionowa, a będzie wycentrowany w wysokości, jeśli layout_orientation poziomej)

<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

Patrz samo w położeniu pionowym

<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

Zobacz także teraz o grawitacji po zastosowaniu ciężkości TextView, „Tekst” w TextView skupia (jeśli grawitacja = center)

<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

Teraz można zrozumieć, że grawitacja ustawia grawitację do treści wewnątrz widżet .. "treść" widżetu może być samym widżetem .. LinearLayout to widżet, a w układzie liniowym dodajemy jeszcze inne typy widżetów (przycisk i widok tekstu) Stosowanie grawitacji = centrum do textview ustawia jego treść (to znaczy tekst) w środku i stosowania grawitacji linearlayout skoncentruje swoją zawartość (tj TextView) w środku

<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