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ę.

Janusz
źródło
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".

JeremyFromEarth
źródło
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

Anke
źródło
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.

Manoj Seelan
źródło
16

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

jqpubliq
źródło
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) 
Rakesh Soni
źródło
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.

Zielony Goblin
źródło
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>
Ahmed Hamdy
źródło
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.

JeremyFromEarth
źródło
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>
Yar
źródło
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"

Priyanka
źródło
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

Rebeka
źródło
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" />
Dinesh Saini
źródło
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).

Akshay Chopra
źródło
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>
Katrina Khan
źródło
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>
Rahul Mandaliya
źródło
3
Czy to jest „waga” czy „układ_waga”?
IgorGanapolsky
To jest android: layout_weight
Mahendra Gunawardena
0

Podstawić wrap_contentz fill_parent.

Humberto Pinheiro
źródło
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

سیدرسول میرعظیمی
źródło