Odpowiedzi:
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.
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.
Ogólnie formuła jest następująca:
miejsce przypisane do dziecka = (indywidualna waga dziecka) / (suma wagi każdego dziecka w układzie liniowym)
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)
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)
android:layout_width="0px"jest ważne. Ponadto wagi nie muszą być liczbami całkowitymi.
weightSumpojawia się obraz? Czy to ma coś wspólnego z layout_weight?
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
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ć.
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ę.

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.)
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).
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ść.
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>
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:
i

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ć,
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).
http://developer.android.com/guide/topics/ui/layout-objects.html#linearlayout
layout_weight określa, ile miejsca kontrolka musi uzyskać odpowiednio do innych kontrolek.
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>
Łą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.
Dodanie android:autoSizeTextType="uniform"spowoduje automatyczne zmianę rozmiaru tekstu
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.