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.
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.
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.
quelle
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
Es folgt ein Beispiel
Das wird so aussehen
quelle
Die Dokumentation sagt es am besten und enthält ein Beispiel (das meine hervorhebt).
Um das Beispiel von superM zu korrigieren, nehmen wir an, Sie haben eine
LinearLayout
mit horizontaler Ausrichtung, die zweiImageViews
und eineTextView
mit enthält. Sie definierenTextView
eine feste Größe, und Sie möchten, dass die beidenImageViews
den verbleibenden Platz gleichmäßig einnehmen.Um dies zu erreichen, würden Sie
layout_weight
jeweils 1 auf jede anwendenImageView
, keine auf dieTextView
und eineweightSum
von 2,0 auf dieLinearLayout
.quelle
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 mitmatch_parent
oderfill_parent
in der Dimension des LinearLayout (z . B.layout_width
fürorientation="horizontal"
). Wir werden diesen Wert den Gewichtsmultiplikator für jedes Element nennen. Der Standardwert fürweightSum
1,0 ist , so das Standardgewicht - Multiplizierer ist1/n
, wobein
die Anzahl derfill_parent
Elemente;wrap_content
Elemente tragen nicht dazu bein
.Wenn
weightSum
beispielsweise 60 ist und 3fill_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 anrufenexpansion_remainer
. Dieser Rest verteilt sich auf diefill_parent
Elemente entsprechend ihrerlayout_weight
.Drittens wird die Erweiterung jedes
fill_parent
Elements wie folgt berechnet:Beispiel:
Wenn
weightSum
60 ist und es 3fill_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.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 diefill_parent
Elemente verteilt. WennweightSum
gesetzt, hat dieslayout_weight
keine Auswirkung aufwrap_content
Elemente. Allerdingswrap_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 allerlayout_weight
Werte berechnet, einschließlich der Elemente mitwrap_content
set! Also habenlayout_weight
am Setwrap_content
Elemente, können ihre Expansion beeinflussen. Zum Beispiel schrumpft ein negatives Gewicht die anderenfill_parent
Elemente. Bevor diefill_parent
Elemente angeordnet werden, wird die obige Formel aufwrap_content
Elemente angewendet , wobei die maximal mögliche Erweiterung ihre Erweiterung entsprechend dem umhüllten Inhalt ist. Diewrap_content
Elemente werden verkleinert und anschließend wird die maximal mögliche Erweiterung für die verbleibendenfill_parent
Elemente berechnet und verteilt.Dies kann zu nicht intuitiven Ergebnissen führen.
quelle
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"
quelle
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 allelayout_height
Eigenschaften haben (die in Ihrer XML vorhanden sein müssen) Datei) gesetzt auf0dp
. Scheint, als würde jeder andere Wert in einigen Fällen die Dinge durcheinander bringen.quelle
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.
quelle
Aus Entwicklerdokumentation
Dies kann zum Beispiel verwendet werden, um einem einzelnen Kind
50%
den gesamten verfügbaren Speicherplatz zuzuweisen, indem es ein layout_weight von0.5
und die weightSum auf setzt1.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.quelle