Ich möchte wissen: Was ist Android: weightSum und layout weight und wie funktionieren sie?
Per Dokumentation, Android:weightSum
definiert die maximale Gewichtssumme und wird berechnet als die Summe der layout_weight
aller Kinder, wenn nicht explizit angegeben.
Betrachten wir ein Beispiel mit einem LinearLayout
mit horizontaler Ausrichtung und 3 ImageViews
darin. Nun wollen wir, dass diese ImageViews
immer den gleichen Platz einnehmen. Um dies zu erreichen, können Sie das layout_weight
von jedem ImageView
bis 1 und dem weightSum
werden so berechnet, dass sie gleich 3 sind, wie im Kommentar gezeigt.
<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
ist nützlich, um das Layout für jedes Gerät korrekt zu rendern. Dies tritt nicht auf, wenn Sie Breite und Höhe direkt festlegen.
Hinzufügen zu SuperM's und Jeff's Antwort,
Wenn das LinearLayout zwei Ansichten enthält, die erste mit einem layout_weight von 1, die zweite mit einem layout_weight von 2 und keine weightSum angegeben ist, wird die weightSum standardmäßig 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 weightSum als 5 angeben würden, würde das erste 1/5 des Platzes einnehmen, während das zweite 2/5 einnehmen würde. Somit würde insgesamt 3/5 des Platzes durch das Layout belegt, während der Rest leer bleibt.
Die Gewichtungssumme funktioniert genau so, wie Sie es möchten (wie bei anderen Antworten müssen Sie nicht alle Gewichtungen im übergeordneten Layout summieren). Geben Sie in der untergeordneten Ansicht das Gewicht an, das Sie verwenden 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 (Hervorhebung meiner).
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 Platzes zu geben, indem ein layout_weight von 0,5 angegeben und die weightSum auf 1,0 gesetzt wird.
Angenommen, Sie haben ein LinearLayout
mit horizontaler Ausrichtung, das zwei ImageViews
und ein TextView
mit enthält, um das Beispiel von superM zu korrigieren. Sie definieren, dass TextView
eine feste Größe hat, und Sie möchten, dass die beiden ImageViews
den verbleibenden Platz gleichermaßen einnehmen.
Um dies zu erreichen, würden Sie layout_weight
1 für jedes ImageView
, keines für das TextView
und ein weightSum
von 2,0 für das LinearLayout
.
Nach einigem Experimentieren denke ich, dass der Algorithmus für LinearLayout der folgende ist:
Angenommen, weightSum
ist auf einen Wert gesetzt. Der Fall der Abwesenheit wird später besprochen.
Teilen Sie zunächst das weightSum
durch die Anzahl der Elemente mit match_parent
oder fill_parent
in der Dimension des LinearLayouts (z. B. layout_width
für orientation="horizontal"
). Wir werden diesen Wert den Gewichtsmultiplikator nennen für jedes Element. Der Standardwert für
weightSum
ist 1.0. Der Standardgewichtungsmultiplikator ist 1/n
, wobei n
die Anzahl der fill_parent
Elemente ist. wrap_content
Elemente tragen nicht zu n
bei.
Z.B. Wenn weightSum
60 ist und es 3 fill_parent
Elemente gibt, ist der Gewichtungsmultiplikator 20. Der Gewichtungsmultiplikator ist der Standardwert für z. layout_width
wenn das Attribut fehlt.
Zweitens wird die maximal mögliche Ausdehnung jedes Elements berechnet. Zunächst werden die wrap_content
-Elemente entsprechend ihrem Inhalt berechnet. Ihre Ausdehnung wird von der Ausdehnung des übergeordneten Containers abgezogen. Wir werden den Verbleibenden expansion_remainer
nennen. Dieser Rest verteilt sich auf fill_parent
Elemente entsprechend ihrem layout_weight
.
Drittens wird die Erweiterung jedes fill_parent
-Elements wie folgt berechnet:
layout_weight / w_m ) * maximum_possible_expansion">
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 von übergeordneter Container.
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, d. H. Die Gewichte sind auf 0 begrenzt.
Wenn ein Element auf wrap_content
gesetzt ist, wird zuerst seine Erweiterung berechnet und die verbleibende Erweiterung unter den fill_parent
Elementen aufgeteilt. Wenn weightSum
gesetzt ist, führt dies dazu, dass layout_weight
keine Auswirkungen auf wrap_content
Elemente hat. wrap_content
Elemente können jedoch weiterhin von Elementen aus dem sichtbaren Bereich verschoben werden, deren Gewicht niedriger als ist (z. B. zwischen 0-1 für
weightSum
= 1 oder zwischen 0-20 für das obige Beispiel).
Wenn kein weightSum
angegeben ist, wird es als Summe aller layout_weight
Werte berechnet --- (einschließlich Elemente mit wrap_content
gesetzt! Wenn also layout_weight
auf wrap_content
Elemente gesetzt ist, kann kann deren Expansion beeinflussen. Z.B. Ein negatives Gewicht verkleinert 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 umschlossenen Inhalt ist. Die wrap_content
Elemente werden verkleinert und anschließend 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 Platzes zu geben, indem ihm ein layout_weight von 0,5 gegeben und die weightSum auf 1,0 gesetzt wird. 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 von niemand anderem erwähnt wird: Nehmen wir an, Sie haben ein vertikalLinearLayout
, damit die Gewichte in Layout/Element/Ansicht 100% korrekt funktionieren. alle müssen layout_height
Eigenschaft (die in Ihrer XML-Datei vorhanden sein muss) auf 0dp
. Scheint, als würde jeder andere Wert in einigen Fällen die Dinge durcheinander bringen.
Layout-Gewichtung 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 Layout-Gewicht 2 und das andere das Layout-Gewicht 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. Das heißt Gewichtssumme unterteilt das gesamte Layout in definierte Teile.nd das Layoutgewicht definiert, wie viel Anteil der jeweilige Artikel an der vordefinierten Gesamtgewichtssumme einnimmt. Gewichtssumme kann auch manuell deklariert werden. Schaltflächen, Textansichten, Texte usw. werden bei Verwendung linearer Layouts für die Gestaltung der Benutzeroberfläche anhand der Gewichtung und der Layoutgewichtung organisiert.
Vom Entwickler Dokumentation
Dies kann zum Beispiel verwendet werden, um einem einzelnen Kind 50%
des gesamten verfügbaren Speicherplatzes durch Angabe eines layout_weight von 0.5
und setzen Sie die weightSum auf 1.0
.
Ergänzung zu @Shubhayu Antwort
sich ausruhen 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 mögliche Verwendung von Android:weightSum
Eigentum.