Ich möchte wissen: Was ist Android: weightSum und Layoutgewicht und wie funktionieren sie?
Ich möchte wissen: Was ist Android: weightSum und Layoutgewicht und wie funktionieren sie?
Antworten:
Definiert gemäß Dokumentation android:weightSum
die maximale Gewichtssumme und wird als die Summe layout_weight
aller untergeordneten Elemente berechnet, wenn nicht explizit angegeben.
Betrachten wir ein Beispiel mit einer LinearLayout
horizontalen Ausrichtung und 3 ImageViews
darin. Jetzt wollen wir, dass diese ImageViews
immer den gleichen Platz einnehmen. Um dies zu erreichen, können Sie layout_weight
jeweils ImageView
1 auf 1 setzen und das weightSum
wird wie im Kommentar gezeigt gleich 3 berechnet.
<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
Dies ist nützlich, damit das Layout für jedes Gerät korrekt gerendert wird. Dies ist nicht der Fall, wenn Sie Breite und Höhe direkt einstellen.
Hinzufügen zu der Antwort von superM und Jeff,
Wenn das LinearLayout zwei Ansichten enthält, die erste mit einem layout_weight von 1, die zweite mit einem layout_weight von 2 und ohne weightSum. Standardmäßig wird die weightSum mit 3 (Summe der Gewichte der untergeordneten Elemente) und berechnet Die erste Ansicht nimmt 1/3 des Platzes ein, während die zweite 2/3 einnimmt.
Wenn wir jedoch die weightSum als 5 angeben würden, würde die erste 1/5 des Leerzeichens einnehmen, während die zweite 2/5 einnehmen würde. Insgesamt würde also 3/5 des Platzes durch das Layout belegt, während der Rest leer bleibt.
Die Gewichtssumme funktioniert genau so, wie Sie möchten (wie bei anderen Antworten müssen Sie nicht alle Gewichte im übergeordneten Layout summieren). Geben Sie in der untergeordneten Ansicht das Gewicht an, das Sie annehmen möchten. Vergessen Sie nicht anzugeben
android:layout_width="0dp"
Es folgt ein Beispiel
<LinearLayout
android:layout_width="500dp"
android:layout_height="20dp" >
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="3"
android:background="@android:color/holo_green_light"
android:gravity="center"
android:text="30%"
android:textColor="@android:color/white" >
</TextView>
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:background="@android:color/holo_blue_bright"
android:gravity="center"
android:text="20%"
android:textColor="@android:color/white" >
</TextView>
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="5"
android:background="@android:color/holo_orange_dark"
android:gravity="center"
android:text="50%"
android:textColor="@android:color/white" >
</TextView>
</LinearLayout>
Das wird so aussehen
Die Dokumentation sagt es am besten und enthält ein Beispiel (das meine hervorhebt).
android: weightSum
Definiert die maximale Gewichtssumme. Wenn nicht angegeben, wird die Summe berechnet, indem das layout_weight aller untergeordneten Elemente hinzugefügt wird. Dies kann zum Beispiel verwendet werden, um einem einzelnen Kind 50% des gesamten verfügbaren Speicherplatzes zu geben, indem es ein layout_weight von 0,5 gibt und die weightSum auf 1,0 setzt.
Um das Beispiel von superM zu korrigieren, nehmen wir an, Sie haben eine LinearLayout
mit horizontaler Ausrichtung, die zwei ImageViews
und eine TextView
mit enthält. Sie definieren TextView
eine feste Größe, und Sie möchten, dass die beiden ImageViews
den verbleibenden Platz gleichmäßig einnehmen.
Um dies zu erreichen, würden Sie layout_weight
jeweils 1 auf jede anwenden ImageView
, keine auf die TextView
und eine weightSum
von 2,0 auf dieLinearLayout
.
Nach einigen Experimenten denke ich, dass der Algorithmus für LinearLayout folgendermaßen lautet:
Annehmen, dass weightSum
ist auf einen Wert festgelegt. Der Fall der Abwesenheit wird später besprochen.
Teilen Sie zunächst die weightSum
durch die Anzahl der Elemente mit match_parent
oder fill_parent
in der Dimension des LinearLayout (z . B. layout_width
für orientation="horizontal"
). Wir werden diesen Wert den Gewichtsmultiplikator für jedes Element nennen. Der Standardwert für weightSum
1,0 ist , so das Standardgewicht - Multiplizierer ist 1/n
, wobei n
die Anzahl der fill_parent
Elemente; wrap_content
Elemente tragen nicht dazu bei n
.
Wenn weightSum
beispielsweise 60 ist und 3 fill_parent
Elemente vorhanden sind , ist der Gewichtsmultiplikator 20. Der Gewichtsmultiplikator ist der Standardwert für z. B. layout_width
wenn das Attribut fehlt.
Zweitens wird die maximal mögliche Ausdehnung jedes Elements berechnet. Zunächst werden die wrap_content
Elemente nach ihrem Inhalt berechnet. Ihre Erweiterung wird von der Erweiterung des übergeordneten Containers abgezogen. Wir werden den Verbleibenden anrufen expansion_remainer
. Dieser Rest verteilt sich auf die fill_parent
Elemente entsprechend ihrerlayout_weight
.
Drittens wird die Erweiterung jedes fill_parent
Elements wie folgt berechnet:
Beispiel:
Wenn weightSum
60 ist und es 3 fill_parent
Elemente mit den Gewichten 10, 20 und 30 gibt, beträgt ihre Erweiterung auf dem Bildschirm 2/3, 1/3 und 0/3 des übergeordneten Containers.
weight | expansion
0 | 3/3
10 | 2/3
20 | 1/3
30 | 0/3
40 | 0/3
Die minimale Ausdehnung ist auf 0 begrenzt. Die maximale Ausdehnung ist auf die übergeordnete Größe begrenzt, dh die Gewichte sind auf 0 begrenzt.
Wenn ein Element auf eingestellt wrap_content
ist, wird zuerst seine Erweiterung berechnet, und die verbleibende Erweiterung wird auf die fill_parent
Elemente verteilt. Wenn weightSum
gesetzt, hat dies layout_weight
keine Auswirkung auf wrap_content
Elemente. Allerdings wrap_content
können immer noch Elemente durch Elemente , dessen Gewicht niedriger ist als geschoben aus dem sichtbaren Bereich sein (beispielsweise zwischen 0-1 fürweightSum
= 1 oder zwischen 0-20 für das obige Beispiel).
Wenn no weightSum
angegeben wird, wird es als die Summe aller layout_weight
Werte berechnet, einschließlich der Elemente mit wrap_content
set! Also haben layout_weight
am Set wrap_content
Elemente, können ihre Expansion beeinflussen. Zum Beispiel schrumpft ein negatives Gewicht die anderen fill_parent
Elemente. Bevor die fill_parent
Elemente angeordnet werden, wird die obige Formel auf wrap_content
Elemente angewendet , wobei die maximal mögliche Erweiterung ihre Erweiterung entsprechend dem umhüllten Inhalt ist. Die wrap_content
Elemente werden verkleinert und anschließend wird die maximal mögliche Erweiterung für die verbleibenden fill_parent
Elemente berechnet und verteilt.
Dies kann zu nicht intuitiven Ergebnissen führen.
Wenn nicht angegeben, wird die Summe berechnet, indem das layout_weight aller untergeordneten Elemente hinzugefügt wird. Dies kann zum Beispiel verwendet werden, um einem einzelnen Kind 50% des gesamten verfügbaren Speicherplatzes zu geben, indem es ein layout_weight von 0,5 gibt und die weightSum auf 1,0 setzt. Muss ein Gleitkommawert sein, z. B. "1.2"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_rel"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:weightSum="2.0" >
<RelativeLayout
android:id="@+id/child_one"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1.0"
android:background="#0000FF" >
</RelativeLayout>
<RelativeLayout
android:id="@+id/child_two"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1.0"
android:background="#00FF00" >
</RelativeLayout>
</LinearLayout>
Eine Sache, die anscheinend niemand anderes erwähnt hat: Nehmen wir an, Sie haben eine Vertikale LinearLayout
. Damit die Gewichte in Layout / Element / Ansicht darin 100% richtig funktionieren, müssen alle layout_height
Eigenschaften haben (die in Ihrer XML vorhanden sein müssen) Datei) gesetzt auf 0dp
. Scheint, als würde jeder andere Wert in einigen Fällen die Dinge durcheinander bringen.
Das Layoutgewicht funktioniert wie ein Verhältnis. Wenn beispielsweise ein vertikales Layout vorhanden ist und zwei Elemente (z. B. Schaltflächen oder Textansichten) vorhanden sind, hat eines das Layoutgewicht 2 und das andere das Layoutgewicht 3. Dann belegt das erste Element 2 von 5 Teilen des Bildschirms / Layouts und das andere 3 von 5 Teilen. Hier ist 5 die Gewichtssumme. dh die Gewichtssumme unterteilt das gesamte Layout in definierte Teile. Und Layoutgewicht definiert, wie viel Teil der jeweiligen Artikel von der vordefinierten Gesamtgewichtssumme einnimmt. Die Gewichtssumme kann auch manuell deklariert werden. Schaltflächen, Textansichten, Edittexte usw. werden bei Verwendung linearer Layouts für das UI-Design nach Gewichtssumme und Layoutgewicht organisiert.
Dies kann zum Beispiel verwendet werden, um einem einzelnen Kind 50%
den gesamten verfügbaren Speicherplatz zuzuweisen, indem es ein layout_weight von 0.5
und die weightSum auf setzt 1.0
.
Ergänzung zu @ Shubhayu Antwort
rest 3/5
kann für andere untergeordnete Layouts verwendet werden, für die wirklich kein bestimmter Teil des enthaltenen Layouts erforderlich ist.
Dies ist eine potenzielle Nutzung von android:weightSum
Eigentum.
weightSum
. Das Verhalten in Ihrem Beispiel ist identisch mitweightSum
weggelassen, und tatsächlich sollte weightSum in diesem Szenario nicht angegeben werden. Die Dokumentation sagt,weightSum Defines the maximum weight sum. If unspecified, the sum is computed by adding the layout_weight of all of the children.