wake-up-neo.com

Was ist Android: weightSum in Android und wie funktioniert es?

Ich möchte wissen: Was ist Android: weightSum und layout weight und wie funktionieren sie?

151
Dhiral Pandya

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.

118
superM

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.

168
Shubhayu

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

enter image description here

25
asok Buzz

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.

24
Jeff Axelrod

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 w_m 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.

w_m = weightSum / #fill_parent

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:

w_m <em loading=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 weight multiplier (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.

20
Jens Jensen

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>
10
Faakhir

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.

6
Yoav Feuerstein

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.

1
Sami Al-Jabar

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.

1
DjP