Co oznacza android: layout_weight?

Odpowiedzi:

860

Za pomocą layout_weightmożesz określić stosunek wielkości między wieloma widokami. Np. Masz MapViewai, tablektóre powinny pokazać dodatkowe informacje na mapie. Mapa powinna zajmować 3/4 ekranu, a tabela powinna zajmować 1/4 ekranu. Wtedy ustaw layout_weightz mapdo 3 oraz layout_weightztable 1.

Aby to działało, musisz również ustawić wysokość lub szerokość (w zależności od orientacji) na 0px.

Flo
źródło
208
drapak do głowy, dopóki nie wspomnisz o wysokości 0px!
JohnnyLambada,
24
Aby określić, na który z nich będzie miała wpływ waga. Szerokość lub wysokość.
neteinstein
30
Potrzebujesz 0px. Przykład: chcesz zaimplementować tabelę z dwiema kolumnami jednakowej wielkości. Każdy wiersz tabeli jest poziomym układem liniowym z dwiema „komórkami tabeli” (na przykład TextViews), z których każdy ma wagę układu = 0,5. Jeśli określisz layout_width = „wrap_content” w „komórkach tabeli”, szerokość treści zostanie dodana do szerokości obliczonej przez layout_weight, komórki tabeli będą miały różne rozmiary, a kolumny nie będą poprawnie wyrównywane. Musisz więc ustawić layout_width = 0dp, aby Android używał rozkładu_wagi do obliczenia szerokości komórek.
eeeeaaii
3
@ Solace, późna odpowiedź, ale ze względu na kompletność. Wygląda na to, że atrybut wagi nie ma wpływu na RelativeLayout. Działa tylko z LinearLayout. Jeśli widzisz potrzebę ważenia, być może dobrym rozwiązaniem jest utworzenie LinearLayout (z wagami) w RelativeLayout.
bbv
1
czy layout_weight działa tylko dla układu liniowego, czy będzie działać dla każdej grupy widoków.
meShakti
247

W skrócie layout_weightokreśla, jaka część dodatkowej przestrzeni w układzie ma zostać przydzielona do widoku.

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 widoków wynosi zero.

Obliczenia w celu przypisania pozostałej przestrzeni między dzieckiem

Ogólnie formuła jest następująca:

miejsce przypisane do dziecka = (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, a trzeciemu nie przypisano wagi (0), wówczas pozostałej przestrzeni przypisuje się w następujący sposób:

1. pole tekstowe = 1 / (1 + 1 + 0)

2. pole tekstowe = 1 / (1 + 1 + 0)

3. pole tekstowe = 0 / (1 + 1 + 0)

Przykład 2

Załóżmy, że mamy etykietę tekstową i dwa elementy edycji tekstu w poziomym rzędzie. Etykieta nie jest layout_weightokreślona, ​​więc zajmuje minimalną przestrzeń wymaganą do renderowania. Jeśli layout_weightkażdy 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).

Obliczenie:

1. etykieta = 0 / (0 + 1 + 1)

2. pole tekstowe = 1 / (0 + 1 + 1)

3. pole tekstowe = 1 / (0 + 1 + 1)

Jeśli zamiast tego pierwsze jedno pole tekstowe ma wartość layout_weight1, a drugie pole tekstowe ma wartość layout_weight2, wówczas jedna trzecia pozostałego miejsca zostanie przyznana pierwszemu, a dwie trzecie drugiemu (ponieważ twierdzimy, że drugie jeden jest ważniejszy).

Obliczenie:

1. etykieta = 0 / (0 + 1 + 2)

2. pole tekstowe = 1 / (0 + 1 + 2)

3. pole tekstowe = 2 / (0 + 1 + 2)


Artykuł źródłowy

Arka
źródło
19
Znacznie lepsze wyjaśnienie niż aktualnie wybrana odpowiedź.
Odcień
12
Cóż, istnieje proste wytłumaczenie (które doceniam) i drobne szczegóły (które doceniam w inny sposób). Obie są dobre odpowiedzi.
cbmanica,
3
Jak wspomniano w innym miejscu, android:layout_width="0px"jest ważne. Ponadto wagi nie muszą być liczbami całkowitymi.
Brian White
Jest to nieco trudniejsze do zrozumienia niż wybrana odpowiedź, ale daje pełną odpowiedź - szczególnie, gdy niektóre widoki mają wagi, a niektóre nie. To ogromny przypadek użycia, którego nie obejmuje wybrana odpowiedź.
Acey
gdzie zatem weightSumpojawia się obraz? Czy to ma coś wspólnego z layout_weight?
eRaisedToX
72

dodając do innych odpowiedzi, najważniejszą rzeczą, aby to zrobić, jest ustawienie szerokości (lub wysokości) układu na 0px

android:layout_width="0px"

w przeciwnym razie zobaczysz śmieci

roetzi
źródło
Myślę, że zależy to od tego, czy chcesz ukryć widoki, które nie określają ich wag, czy też chcesz pokazać je z rozmiarem dopasowanym do rozmiaru i pozostawić wolne miejsce pozostałym widokom „ważonym”.
Andrea Leganza,
Co się stanie, jeśli będę musiał ustawić ciężar poziomy i pionowy?
Alston
40

Jeśli istnieje wiele widoków obejmujących a LinearLayout, wówczas layout_weightkażdemu z nich nadaje się proporcjonalny rozmiar. Widok o większej layout_weightwartości „waży” więcej, dzięki czemu zyskuje większą przestrzeń.

Oto zdjęcie, aby wyjaśnić.

wprowadź opis zdjęcia tutaj

Teoria

Termin waga układu jest związany z pojęciem średniej ważonej w matematyce. To tak, jak na zajęciach na studiach, gdzie praca domowa jest warta 30%, frekwencja jest warta 10%, w połowie semestr jest warty 20%, a końcowy - 40%. Twoje wyniki dla tych części, po zważeniu razem, dają ci całkowitą ocenę.

wprowadź opis zdjęcia tutaj

To samo dotyczy wagi układu. ViewsW poziomej LinearLayoutkażdy może trwać pewien procent całkowitej szerokości. (Lub procent wysokości pionu LinearLayout.)

Układ

Ten LinearLayout, którego używasz, będzie wyglądał mniej więcej tak:

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

    <!-- list of subviews -->

</LinearLayout>

Pamiętaj, że musisz użyć layout_width="match_parent"do LinearLayout. Jeśli użyjesz wrap_content, to nie będzie działać. Zauważ też, że layout_weightnie działa dla widoków w RelativeLayouts (zobacz tutaj i tutaj odpowiedzi SO dotyczące tego problemu).

Widoki

Każdy widok w poziomie LinearLayoutwygląda mniej więcej tak:

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

Pamiętaj, że musisz używać layout_width="0dp"razem z layout_weight="1". Zapomnienie o tym powoduje problemy wielu nowych użytkowników. (Zobacz ten artykuł, aby uzyskać różne wyniki, nie ustawiając szerokości na 0.) Jeśli twoje widoki są w pionie LinearLayout , to layout_height="0dp"oczywiście skorzystasz.

W Buttonpowyższym przykładzie ustawiłem wagę na 1, ale możesz użyć dowolnej liczby. Liczy się tylko suma. W trzech rzędach przycisków na pierwszym obrazie, który opublikowałem, liczby są różne, ale ponieważ proporcje są takie same, ważone szerokości nie zmieniają się w każdym rzędzie. Niektóre osoby lubią używać liczb dziesiętnych o sumie 1, aby w złożonym układzie było jasne, jaka jest waga każdej części.

Ostatnia uwaga. Jeśli używasz wielu zagnieżdżonych układów layout_weight, może to mieć negatywny wpływ na wydajność.

Dodatkowy

Oto układ xml dla górnego obrazu:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="android:layout_weight="
        android:textSize="24sp" />

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

        <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="2"
            android:text="2" />

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

    </LinearLayout>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="android:layout_weight="
        android:textSize="24sp" />

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

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

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

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

    </LinearLayout>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="android:layout_weight="
        android:textSize="24sp" />

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

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

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

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

    </LinearLayout>

</LinearLayout>
Suragch
źródło
1
Zawsze zastanawiam się, dlaczego więcej osób nie publikuje obrazów towarzyszących ich plikom XML. Znacznie łatwiej jest zrozumieć elementy wizualne niż kod.
AleksandrH
30

layout_weightmówi Androidowi, jak dystrybuować swoje Viewpliki w LinearLayout. Android najpierw oblicza całkowitą proporcję wymaganą dla wszystkich Views, które mają określoną wagę i umieszcza każdą z nich Viewzgodnie z tym, jakiej części ekranu podała, której potrzebuje. W poniższym przykładzie Android wychwyci TextViewy mają layout_weightod 0(to jest standardowo) i EditTexty mają layout_weightod 2siebie, przy czym Buttonma ciężar 1. Dlatego Android przydziela „wystarczającą” przestrzeń do wyświetlenia, tvUsernamea tvPasswordnastępnie dzieli pozostałą część szerokości ekranu na 5 równych części, z których dwie są przydzielone etUsername, dwie do etPasswordi ostatnia część do bLogin:

<LinearLayout android:orientation="horizontal" ...>

    <TextView android:id="@+id/tvUsername" 
    android:text="Username" 
    android:layout_width="wrap_content" ... />

    <EditText android:id="@+id/etUsername"
    android:layout_width="0dp"
    android:layout_weight="2" ... />

    <TextView android:id="@+id/tvPassword"
    android:text="Password"
    android:layout_width="wrap_content" />

    <EditText android:id="@+id/etPassword"
    android:layout_width="0dp"
    android:layout_weight="2" ... />

    <Button android:id="@+id/bLogin"
    android:layout_width="0dp"
    android:layout_weight="1"
    android:text="Login"... />

</LinearLayout>

Wygląda jak:
orientacja krajobrazu i
orientacja pionowa

Tash Pemhiwa
źródło
link nie jest już dostępny. Jeśli masz inne dobre referencje, zaktualizuj.
BinaryGuy,
16

Pomyśl tak, będzie łatwiej

Jeśli masz 3 przyciski, a ich waga wynosi odpowiednio 1,3,1, będzie działać jak tabela w HTML

Podaj 5 części dla tej linii: 1 część dla przycisku 1, 3 część dla przycisku 2 i 1 część dla przycisku 1

Uważać,

George Nguyen
źródło
10

jednym z najlepszych wyjaśnień dla mnie było to (z samouczka Androida, poszukaj kroku 7) :

layout_weight jest używany w LinearLayouts do przypisania „ważności” widokom w obrębie układu. Wszystkie widoki mają domyślną wagę układu wynoszącą zero, co oznacza, że ​​zajmują tylko tyle miejsca na ekranie, ile trzeba wyświetlić. Przypisanie wartości większej od zera spowoduje podzielenie pozostałej dostępnej przestrzeni w Widoku nadrzędnym, zgodnie z wartością każdego układu Widok_wagi i jego stosunku do ogólnej masy_w układzie określonej w bieżącym układzie dla tego i innych elementów Widoku.

Na przykład: 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). Jeśli pierwszy ma wagę układu 1, a drugi ma wagę układu 2, wówczas jedna trzecia pozostałej przestrzeni zostanie przyznana pierwszej, a dwie trzecie drugiej (ponieważ uważamy, że druga jest ważniejsza).

Andre Steingress
źródło
4

Za dodatkowe

Dla verticalorientacji nie zapomnij ustawić heightna 0dp

android:layout_height="0dp"

Dla horizontalorientacji nie zapomnij ustawić widthna 0dp

android:layout_width="0dp"
Alen Lee
źródło
3

Proszę spojrzeć na weightSum LinearLayout i layout_weight każdego widoku. android: weightSum = "4" android: layout_weight = "2" android: layout_weight = "2" Wysokość ich układu wynosi 0px, ale nie jestem pewien, czy to jest istotne

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:weightSum="4">

<fragment android:name="com.example.SettingFragment"
    android:id="@+id/settingFragment"
    android:layout_width="match_parent"
    android:layout_height="0px"
    android:layout_weight="2"
    />

<Button
    android:id="@+id/dummy_button"
    android:layout_width="match_parent"
    android:layout_height="0px"
    android:layout_weight="2"
    android:text="DUMMY"
    />
</LinearLayout>
Ming Leung
źródło
Proszę spojrzeć na weightSum LinearLayout i layout_weight każdego widoku. android: weightSum = "4" android: layout_weight = "2" android: layout_weight = "2" Wysokość ich układu wynosi 0px, ale nie jestem pewien, czy to jest istotne.
Ming Leung
0

Łącząc obie odpowiedzi z

Flo i rptwsthi i roetzi,

Pamiętaj, aby zmienić swój layout_width=0dp/px, w przeciwnym razielayout_weight przeciwnym razie zachowanie będzie działać odwrotnie, przy czym największa liczba zajmuje najmniejsze miejsce, a najniższa liczba zajmuje najwięcej miejsca.

Poza tym niektóre kombinacje wag spowodują, że niektóre układy nie mogą zostać pokazane (ponieważ zajmują zbyt dużo miejsca).

Uważaj na to.

użytkownik 2837483
źródło
0

Dodanie android:autoSizeTextType="uniform"spowoduje automatyczne zmianę rozmiaru tekstu

skryshtafovych
źródło
-1

Jak sama nazwa wskazuje, waga układu określa, jaka ilość lub procent miejsca w danym polu lub widżecie powinno zajmować miejsce na ekranie.
Jeśli podamy wagę w orientacji poziomej, musimy ją określić layout_width = 0px.
Podobnie, jeśli określamy wagę w orientacji pionowej, musimy ją określić layout_height = 0px.

Akanksha Hegde
źródło