Odpowiedzi:
Za pomocą layout_weight
możesz określić stosunek wielkości między wieloma widokami. Np. Masz MapView
ai, table
które powinny pokazać dodatkowe informacje na mapie. Mapa powinna zajmować 3/4 ekranu, a tabela powinna zajmować 1/4 ekranu. Wtedy ustaw layout_weight
z map
do 3 oraz layout_weight
ztable
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_weight
okreś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_weight
określona, więc zajmuje minimalną przestrzeń wymaganą do renderowania. Jeśli layout_weight
każ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_weight
1, a drugie pole tekstowe ma wartość layout_weight
2, 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.
weightSum
pojawia 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_weight
każdemu z nich nadaje się proporcjonalny rozmiar. Widok o większej layout_weight
wartoś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. Views
W poziomej LinearLayout
każ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_weight
nie działa dla widoków w RelativeLayouts (zobacz tutaj i tutaj odpowiedzi SO dotyczące tego problemu).
Każdy widok w poziomie LinearLayout
wyglą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 Button
powyż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_weight
mówi Androidowi, jak dystrybuować swoje View
pliki w LinearLayout
. Android najpierw oblicza całkowitą proporcję wymaganą dla wszystkich View
s, które mają określoną wagę i umieszcza każdą z nich View
zgodnie z tym, jakiej części ekranu podała, której potrzebuje. W poniższym przykładzie Android wychwyci TextView
y mają layout_weight
od 0
(to jest standardowo) i EditText
y mają layout_weight
od 2
siebie, przy czym Button
ma ciężar 1
. Dlatego Android przydziela „wystarczającą” przestrzeń do wyświetlenia, tvUsername
a tvPassword
następnie dzieli pozostałą część szerokości ekranu na 5 równych części, z których dwie są przydzielone etUsername
, dwie do etPassword
i 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
.