Układ liniowy i waga w systemie Android


261

Zawsze czytam o tej zabawnej wartości masy w dokumentacji Androida. Teraz chcę spróbować po raz pierwszy, ale w ogóle nie działa.

Jak rozumiem z dokumentacji ten układ:

  <LinearLayout
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal">

     <Button
        android:text="Register"
        android:id="@+id/register"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dip"
        weight="1" />

     <Button
        android:text="Not this time"
        android:id="@+id/cancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dip"
        weight="1" />

  </LinearLayout>

powinny utworzyć dwa przyciski, które są wyrównane w poziomie i równo dzielą przestrzeń. Problem polega na tym, że dwa przyciski nie rosną, aby wypełnić przestrzeń.

Chciałbym, żeby przyciski rosły i wypełniały całą linię. Jeśli oba przyciski są ustawione tak, aby pasowały do ​​rodzica, tylko pierwszy przycisk jest wyświetlany i wypełnia całą linię.


aktualizacja: obsługa procentowa Androida również może to zrobić bardzo dobrze. code2concept.blogspot.in/2015/08/…
— nitesh

Odpowiedzi:


159

Nie ustawiasz layout_weightwłaściwości. Twój kod czyta weight="1"i powinien czytać android:layout_weight="1".


684

3 rzeczy do zapamiętania:

  • ustaw android: layout_width dzieci na „0dp”
  • ustaw android: weightSum rodzica ( edytuj: jak zauważył Jason Moore, ten atrybut jest opcjonalny, ponieważ domyślnie jest ustawiony na sumę wagi układu dla dzieci)
  • ustaw Androida: układ_wagi każdego dziecka proporcjonalnie (np. wagaSum = „5”, troje dzieci: układ_waga = „1”, układ_waga = „3”, układ_waga = „1”)

Przykład:

    <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:weightSum="5">

    <Button
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="1" />

    <Button
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:text="2" />

    <Button
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="3" />

    </LinearLayout>

A wynik:

Przykład wagi układu


66
Dzięki za wskazówkę dotyczącą ustawienia szerokości na zero. Przekonałem się również, że ustawienie wagi na rodzicu nie było potrzebne.
— Jason Moore,

30
Dobrze wiedzieć, dzięki. Jeśli tak, ustawienie weightSum może być nadal przydatne, gdy nie chcesz, aby dzieci wypełniały 100% rodzica.
— Anke

13
Jest to poprawne w przypadku statycznych układów XML. Jeśli dodajesz Widoki dynamicznie w czasie wykonywania, musisz użyć addView z parametrami układu, takimi jak addView(button, new LinearLayout.LayoutParams(0, height, 1));To prawda, nawet jeśli pompujesz układy o prawidłowych wartościach szerokości i wagi.
— Kowalik

Mówisz: ustaw androida: weightSum rodzica - ustaw na jakąś wartość lub po prostu włóż, jak to ustawić?
— TheJerm

1
@batbrat jest poprawny, dynamicznie generowałem interfejs użytkownika. Czasami traktuję fragmenty XML jako szablony, a następnie modyfikuję lub wypełniam w czasie wykonywania. Ta sztuczka nie działała dla mnie w tym przypadku, musiałem ponownie ustawić wyraźną szerokość i wagę, aby ją uruchomić.
— Kowalik

52

Jest android:layout_weight. Waga może być używana tylko w LinearLayout. Jeśli orientacja liniowego podziału jest pionowa, użyj, android:layout_height="0dp"a jeśli orientacja jest pozioma, użyj android:layout_width = "0dp". Będzie działać idealnie.



16

Spróbuj ustawić layout_widthoba przyciski na „0dip”, a weightoba przyciski na0.5


Teraz oba przyciski zniknęły z ekranu
— Janusz

dobrze, a następnie ustaw szerokość układu zarówno na fill_parent, jak i wagi na 0,5
— jqpubliq

spójrz na to i to . Jestem trochę zdezorientowany, dlaczego to nadal nie działa, ale może da ci to jakieś pomysły.
— jqpubliq

7

LinearLayout obsługuje przypisywanie wagi poszczególnym dzieciom. Ten atrybut przypisuje wartość „ ważności ” do widoku i umożliwia jej rozwinięcie w celu wypełnienia pozostałej przestrzeni w widoku nadrzędnym. Domyślna waga to zero

obliczenia w celu przypisania pozostałej / dodatkowej przestrzeni między dzieckiem. (nie całkowita przestrzeń)

spacja przypisana do child = (indywidualna waga dziecka) / (suma wagi każdego dziecka w układzie liniowym)

Przykład (1): jeśli istnieją trzy pola tekstowe, a dwa z nich deklarują wagę 1, podczas gdy trzecie nie ma żadnego ciężaru (0), wówczas pozostałe / dodatkowe miejsce przypisuje się do

1st text box = 1/(1+1+0) 
2nd text box = 1/(1+1+0) 
3rd text box = 0/(1+1+0) 

Przykład (2) : załóżmy, że mamy etykietę tekstową i dwa elementy edycji tekstu w poziomym rzędzie. W etykiecie nie określono ciężaru układu, więc zajmuje minimalną przestrzeń wymaganą do renderowania. Jeśli parametr layout_weight każdego z dwóch elementów edycji tekstu jest ustawiony na 1, pozostała szerokość w układzie nadrzędnym zostanie równo podzielona między nimi (ponieważ uważamy, że są one równie ważne).

calculation : 
1st label = 0/(0+1+1) 
2nd text box = 1/(0+1+1) 
3rd text box = 1/(0+1+1)

Jeśli pierwsze jedno pole tekstowe ma wagę układu 1, a drugie pole tekstowe ma wagę układu 2, wówczas jedna trzecia pozostałej przestrzeni zostanie przydzielona pierwszemu, a dwie trzecie drugiej (ponieważ twierdzimy, że drugie pole to ważniejsze).

calculation : 
1st label = 0/(0+1+2) 
2nd text box = 1/(0+1+2) 
3rd text box = 2/(0+1+2) 

7

W polu Szerokość przycisku, wymienić wrap-contentz 0dp.
Użyj atrybutu layout_weight widoku.

android:layout_width="0dp"  

Tak będzie wyglądał Twój kod:

<LinearLayout
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:orientation="horizontal">

 <Button
    android:text="Register"
    android:id="@+id/register"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:padding="10dip"
    android:layout_weight="1" />

 <Button
    android:text="Not this time"
    android:id="@+id/cancel"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:padding="10dip"
    android:layout_weight="1" />    

</LinearLayout>

layout_weight służy do rozdzielenia pozostałej przestrzeni na proporcje. W tym przypadku dwa przyciski mają szerokość „0dp”. Pozostała przestrzeń zostanie podzielona na proporcje 1: 1, tzn. Przestrzeń zostanie równo podzielona między widoki przycisków.


6

Jak odpowiedź @Manoj Seelan

Wymienić android:layout_weightWith android:weight.

Gdy używasz wagi z LinearLayout. należy dodać weightSumw LinearLayouti zgodnie z orientacją swojej LinearLayouttrzeba zachodzącego 0dpna szerokość / wysokość do wszystkich LinearLayout`s poglądów dzieci

Przykład:

Jeśli Orientacja Linearlayoutjest Vertical, to Ustaw szerokość wszystkich LinearLayoutwidoków potomnych za pomocą0dp

 <LinearLayout
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="vertical"
     android:weightSum="3">

     <Button
        android:text="Register"
        android:id="@+id/register"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:padding="10dip"
        android:layout_weight="2" />

     <Button
        android:text="Not this time"
        android:id="@+id/cancel"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:padding="10dip"
        android:layout_weight="1" />

  </LinearLayout>

Jeśli orientacja Linearlayoutjest horizontal, to Ustaw wysokość wszystkich LinearLayoutwidoków potomnych za pomocą 0dp.

 <LinearLayout
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal"
     android:weightSum="3">

     <Button
        android:text="Register"
        android:id="@+id/register"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:padding="10dip"
        android:layout_weight="2" />

     <Button
        android:text="Not this time"
        android:id="@+id/cancel"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:padding="10dip"
        android:layout_weight="1" />

  </LinearLayout>

5

Być może ustawienie obu właściwości layout_width przycisków na „fill_parent” załatwi sprawę.

Właśnie przetestowałem ten kod i działa on w emulatorze:

<LinearLayout android:layout_width="fill_parent"
          android:layout_height="wrap_content">

    <Button android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="hello world"/>

    <Button android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="goodbye world"/>

</LinearLayout>

Pamiętaj, aby ustawić parametr layout_width na „fill_parent” na obu przyciskach.


1
powoduje to jedynie wypchnięcie prawego przycisku z ekranu i wyświetlenie tylko pierwszego przycisku.
— Janusz

4
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/logonFormButtons"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:baselineAligned="true"       
        android:orientation="horizontal">

        <Button
            android:id="@+id/logonFormBTLogon"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"            
            android:text="@string/logon"
            android:layout_weight="0.5" />

        <Button
            android:id="@+id/logonFormBTCancel"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"            
            android:text="@string/cancel"
            android:layout_weight="0.5" />
    </LinearLayout>

Teraz wolę zaproponować użycie layout_weight = "50" i layout_width = "0px"
— Yar

2

W powyższym pliku XML ustaw android:layout_weightukład liniowy jako 2: android:layout_weight="2"


3
Dlaczego to jest potrzebne? Dlaczego waga układu 2 jest ważna? Dlaczego nie 20 lub 200?
— Conrad Frix,

2

Dodatkowo musisz dodać to android:layout_width="0dp"dla widoków dzieci [Widok przycisków]LinerLayout


2

Musisz tak napisać, że działa dla mnie

<LinearLayout
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:orientation="horizontal"
            android:weightSum="2">

         <Button
            android:text="Register"
            android:id="@+id/register"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dip"
            android:layout_weight="1" />

         <Button
            android:text="Not this time"
            android:id="@+id/cancel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dip"
            android:layout_weight="1" />

2

Poniżej znajdują się zmiany (oznaczone BOLD ) w kodzie:

<LinearLayout
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal">

     <Button
        android:text="Register"
        android:id="@+id/register"
        android:layout_width="0dp" //changes made here
        android:layout_height="wrap_content"
        android:padding="10dip"
        android:layout_weight="1" /> //changes made here

     <Button
        android:text="Not this time"
        android:id="@+id/cancel"
        android:layout_width="0dp" //changes made here
        android:layout_height="wrap_content"
        android:padding="10dip"
        android:layout_weight="1" /> //changes made here

  </LinearLayout>

Ponieważ układ LinearLayout ma orientację poziomą, musisz zachować szerokość tylko 0dp. do używania obciążników w tym kierunku. (Gdyby twoja orientacja była pionowa, utrzymałbyś wysokość tylko 0dp) .

Ponieważ są dwa widoki, które zostały umieszczone android:layout_weight="1"dla obu widoków, oznacza to, że oba widoki zostaną podzielone równo w kierunku poziomym (lub według szerokości).


1
 <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:text="Button 1" />

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:text="Button 2" />

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:text="Button 3" />

    </LinearLayout>

0

To idealna odpowiedź na Twój problem

  <LinearLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:orientation="horizontal"  >   
     <Button 
        android:text="Register" android:id="@+id/register"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:padding="10dip" weight="1" />
     <Button 
        android:text="Not this time" android:id="@+id/cancel"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:padding="10dip" weight="1" />
  </LinearLayout>

3
Czy to jest „waga” czy „układ_waga”?
— IgorGanapolsky

To jest android: layout_weight
— Mahendra Gunawardena


0
 <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:background="#008">

            <RelativeLayout
                android:id="@+id/paneltamrin"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="center"

                >
                <Button
                    android:id="@+id/BtnT1"
                    android:layout_width="wrap_content"
                    android:layout_height="150dp"
                    android:drawableTop="@android:drawable/ic_menu_edit"
                    android:drawablePadding="6dp"
                    android:padding="15dp"
                    android:text="AndroidDhina"
                    android:textColor="#000"
                    android:textStyle="bold" />
            </RelativeLayout>

            <RelativeLayout
                android:id="@+id/paneltamrin2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="center"
                >
                <Button
                    android:layout_width="wrap_content"
                    android:layout_height="150dp"
                     android:drawableTop="@android:drawable/ic_menu_edit"
                    android:drawablePadding="6dp"
                    android:padding="15dp"
                    android:text="AndroidDhina"
                    android:textColor="#000"
                    android:textStyle="bold" />

            </RelativeLayout>
        </LinearLayout>

wprowadź opis zdjęcia tutaj

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.