Według dokumentacji android:weightSum
określa maksymalną sumę wag i jest obliczana jako suma layout_weight
wszystkich elementów podrzędnych, jeśli nie została wyraźnie określona.
Rozważmy przykład z LinearLayout
orientacją poziomą i 3 w ImageViews
środku. Teraz chcemy, aby ImageViews
zawsze zajmowały równą przestrzeń. Aby to osiągnąć, możesz ustawić layout_weight
każdy ImageView
na 1, a weightSum
zostanie obliczony jako równy 3, jak pokazano w komentarzu.
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
<!-- android:weightSum="3" -->
android:orientation="horizontal"
android:layout_gravity="center">
<ImageView
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_width="0dp"/>
.....
weightSum
przydaje się do prawidłowego renderowania układu dla dowolnego urządzenia, co nie nastąpi, jeśli bezpośrednio ustawisz szerokość i wysokość.
weightSum
. Zachowanie w twoim przykładzie byłoby identyczne zweightSum
pominiętym i faktycznie weightSum nie powinno być określane w tym scenariuszu. Dokumentacja mówiweightSum Defines the maximum weight sum. If unspecified, the sum is computed by adding the layout_weight of all of the children.
Dodając do odpowiedzi superM i Jeffa,
Jeśli w LinearLayout znajdują się 2 widoki, pierwszy z wartością layout_weight równą 1, drugi z wartością layout_weight równą 2 i bez parametru weightSum, domyślnie weightSum jest obliczana na 3 (suma wag elementów podrzędnych) i pierwszy widok zajmuje 1/3 powierzchni, a drugi 2/3.
Gdybyśmy jednak mieli określić wagę sumy jako 5, pierwsza zajęłaby 1/5 przestrzeni, a druga 2/5. Zatem w sumie 3/5 powierzchni byłaby zajęta przez układ, pozostawiając pustą resztę.
źródło
Suma wag działa dokładnie tak, jak chcesz (podobnie jak w przypadku innych odpowiedzi nie musisz sumować wszystkich wag w układzie nadrzędnym). W widoku podrzędnym określ, jaką wagę ma przyjąć. Nie zapomnij określić
Oto przykład
To będzie wyglądać
źródło
Dokumentacja mówi, że najlepiej i zawiera przykładowe (pokazujące moje).
Aby poprawić przykład superM, załóżmy, że masz element
LinearLayout
z orientacją poziomą, który zawiera dwaImageViews
iTextView
z. Definiujesz,TextView
aby mieć stały rozmiar i chcesz, aby te dwaImageViews
równo zajmowały pozostałe miejsce.Aby to osiągnąć, zastosowałbyś
layout_weight
1 do każdegoImageView
, żadnego naTextView
iweightSum
2,0 naLinearLayout
.źródło
Po kilku eksperymentach myślę, że algorytm LinearLayout wygląda tak:
Załóżmy, że
weightSum
jest ustawiony na wartość. Przypadek nieobecności zostanie omówiony później.Najpierw podziel
weightSum
przez liczbę elementów zmatch_parent
lubfill_parent
w wymiarze LinearLayout (np.layout_width
Dlaorientation="horizontal"
). Wartość tę nazwiemy mnożnikiem wagi dla każdego elementu. Wartość domyślnaweightSum
to 1.0, więc domyślny mnożnik wagi to1/n
, gdzien
jest liczbąfill_parent
elementów;wrap_content
elementy nie przyczyniają się don
.Np. Gdy
weightSum
wynosi 60 i są 3fill_parent
elementy, mnożnik wagi wynosi 20. Mnożnik wagi jest wartością domyślną, np. Wlayout_width
przypadku braku atrybutu.Po drugie, obliczana jest maksymalna możliwa ekspansja każdego elementu. Najpierw
wrap_content
elementy są obliczane zgodnie z ich zawartością. Ich rozszerzenie jest odejmowane od rozwinięcia kontenera nadrzędnego. Pozostałych zadzwonimyexpansion_remainer
. Ta reszta jest rozdzielana międzyfill_parent
elementy zgodnie z ichlayout_weight
.Po trzecie, rozwinięcie każdego
fill_parent
elementu jest obliczane jako:Przykład:
Jeśli
weightSum
wynosi 60 i są 3fill_parent
elementy o wadze 10, 20 i 30, ich rozwinięcie na ekranie wynosi 2/3, 1/3 i 0/3 pojemnika nadrzędnego.Minimalna ekspansja jest ograniczona do 0. Maksymalna ekspansja jest ograniczona do rozmiaru rodzica, tj. Wagi są ograniczone do 0.
Jeśli element jest ustawiony na
wrap_content
, jego rozwinięcie jest obliczane jako pierwsze, a pozostała ekspansja podlega dystrybucji międzyfill_parent
elementy. JeśliweightSum
jest ustawiona, prowadzi to dolayout_weight
braku wpływu nawrap_content
elementy. Jednakwrap_content
elementy mogą być nadal wypychane z widocznego obszaru przez elementy, których waga jest mniejsza niż (np. Między 0-1 dlaweightSum
= 1 lub między 0-20 dla powyższego przykładu).Jeśli nie
weightSum
określono, jest obliczana jako suma wszystkichlayout_weight
wartości, w tym elementów zwrap_content
ustawieniem! Tak więclayout_weight
nastawienie nawrap_content
żywioły może wpłynąć na ich ekspansję. Np. Ujemna waga zmniejszy pozostałefill_parent
elementy. Czy przed rozłożeniemfill_parent
elementów powyższa formuła zostanie zastosowana dowrap_content
elementów, przy czym maksymalnym możliwym rozszerzeniem będzie ich rozszerzanie się zgodnie z opakowaną zawartością. Tewrap_content
elementy będą skurczony, po czym maksymalna możliwa ekspansji dla pozostałychfill_parent
elementów jest obliczana i rozdzielone.Może to prowadzić do nieintuicyjnych wyników.
źródło
Jeśli nie zostanie określony, suma jest obliczana przez dodanie layoutu_weight wszystkich elementów podrzędnych. Można to wykorzystać na przykład do przydzielenia jednemu dziecku 50% całkowitej dostępnej przestrzeni, nadając mu layout_weight równy 0,5 i ustawiając weightSum na 1,0. Musi być wartością zmiennoprzecinkową, np. „1,2”
źródło
Jedna rzecz, o której nikt inny nie wspomniał: powiedzmy, że masz pion
LinearLayout
, więc aby wagi w układzie / elemencie / widoku wewnątrz działały w 100% - wszystkie muszą miećlayout_height
właściwość (która musi istnieć w twoim xml file) ustawione na0dp
. Wydaje się, że każda inna wartość może w niektórych przypadkach zepsuć sprawę.źródło
Waga układu działa jak współczynnik. Na przykład, jeśli istnieje układ pionowy i są tam dwa elementy (takie jak przyciski lub widoki tekstu), jeden ma wagę układu 2, a drugi odpowiednio wagę układu 3. Wtedy pierwsza pozycja zajmie 2 z 5 części ekranu / układu, a druga 3 z 5 części. Tutaj 5 to suma wag. tzn. suma wag dzieli cały układ na określone porcje. A Layout Weight (waga układu) określa, jaką część zajmuje dany przedmiot z całkowitej wstępnie zdefiniowanej sumy wag. Sumę wagi można również zadeklarować ręcznie. Przyciski, podglądy tekstu, edittexty itp. Są zorganizowane przy użyciu wagi i wagi układu podczas korzystania z układów liniowych do projektowania interfejsu użytkownika.
źródło
Z dokumentacji programisty
Można to wykorzystać na przykład do nadania pojedynczemu podrzędnemu
50%
całkowitej dostępnej przestrzeni, nadając mu layout_weight0.5
i ustawiając weightSum na1.0
.Dodatek do odpowiedzi @Shubhayu
reszta
3/5
może być używana dla innych układów potomnych, które naprawdę nie wymagają żadnej określonej części układu zawierającego.jest to potencjalne wykorzystanie
android:weightSum
własności.źródło