Was bedeutet android: layout_weight?


Antworten:


858

Mit können layout_weightSie ein Größenverhältnis zwischen mehreren Ansichten festlegen. ZB haben Sie ein MapViewund ein, tabledas einige zusätzliche Informationen zur Karte anzeigen sollte. Die Karte sollte 3/4 des Bildschirms verwenden und die Tabelle sollte 1/4 des Bildschirms verwenden. Dann setzen Sie die layout_weightvon der mapauf 3 und die layout_weightvon der tableauf 1.

Damit es funktioniert, müssen Sie auch die Höhe oder Breite (abhängig von Ihrer Ausrichtung) auf 0px einstellen.


207
Kopfkratzer bis du die 0px Höhe erwähnt hast!
Johnny Lambada

24
Festlegen, welche davon vom Gewicht betroffen sind. Breite oder Höhe.
Neteinstein

30
Sie benötigen die 0px. Beispiel: Sie möchten eine Tabelle mit zwei gleich großen Spalten implementieren. Jede Tabellenzeile ist ein horizontales lineares Layout mit zwei "Tabellenzellen" (z. B. TextViews), von denen jede layout_weight = .5 hat. Wenn Sie in den "Tabellenzellen" layout_width = "wrap_content" angeben, wird die Inhaltsbreite zu der durch layout_weight berechneten Breite hinzugefügt, die Tabellenzellen haben alle unterschiedliche Größen und die Spalten werden nicht korrekt ausgerichtet. Sie müssen also layout_width = 0dp festlegen, damit Android nur layout_weight verwendet, um die Breite der Zellen zu berechnen.
Eeeeaaii

3
@Solace, späte Antwort, aber der Vollständigkeit halber. Scheint, als würde das Gewichtsattribut nicht zu RelativeLayout beitragen. Es funktioniert nur mit LinearLayout. Wenn Sie einen Bedarf an Gewicht sehen, besteht der richtige Weg möglicherweise darin, ein LinearLayout (mit Gewichtungen) in RelativeLayout zu erstellen.
BBV

1
Funktioniert layout_weight nur für lineares Layout oder funktioniert es für jede Ansichtsgruppe?
MeShakti

247

Kurz gesagt, layout_weightgibt an, wie viel zusätzlicher Speicherplatz im Layout der Ansicht zugewiesen werden soll.

LinearLayout unterstützt das Zuweisen eines Gewichts zu einzelnen Kindern. Dieses Attribut weist einer Ansicht einen "Wichtigkeits" -Wert zu und ermöglicht das Erweitern, um den verbleibenden Platz in der übergeordneten Ansicht zu füllen. Das Standardgewicht von Ansichten ist Null.

Berechnung, um den verbleibenden Platz zwischen den Kindern zuzuweisen

Im Allgemeinen lautet die Formel:

Platz, der dem Kind zugewiesen ist = (individuelles Gewicht des Kindes) / (Summe des Gewichts jedes Kindes im linearen Layout)

Beispiel 1

Wenn drei Textfelder vorhanden sind und zwei davon eine Gewichtung von 1 deklarieren, während das dritte keine Gewichtung (0) erhält, wird der verbleibende Platz wie folgt zugewiesen:

1. Textfeld = 1 / (1 + 1 + 0)

2. Textfeld = 1 / (1 + 1 + 0)

3. Textfeld = 0 / (1 + 1 + 0)

Beispiel 2

Angenommen, wir haben eine Textbeschriftung und zwei Textbearbeitungselemente in einer horizontalen Zeile. Das Etikett ist nicht layout_weightangegeben, daher nimmt es den zum Rendern erforderlichen Mindestspeicherplatz ein. Wenn layout_weightjedes der beiden Textbearbeitungselemente auf 1 gesetzt ist, wird die verbleibende Breite im übergeordneten Layout gleichmäßig zwischen ihnen aufgeteilt (da wir behaupten, dass sie gleich wichtig sind).

Berechnung:

1. Etikett = 0 / (0 + 1 + 1)

2. Textfeld = 1 / (0 + 1 + 1)

3. Textfeld = 1 / (0 + 1 + 1)

Wenn stattdessen das erste Textfeld eine layout_weight1 und das zweite eine layout_weight2 hat, wird ein Drittel des verbleibenden Platzes dem ersten und zwei Drittel dem zweiten Platz zugewiesen (weil wir das zweite beanspruchen eins ist wichtiger).

Berechnung:

1. Etikett = 0 / (0 + 1 + 2)

2. Textfeld = 1 / (0 + 1 + 2)

3. Textfeld = 2 / (0 + 1 + 2)


Quellartikel


18
Eine viel bessere Erklärung als die aktuell ausgewählte Antwort.
Schatten

12
Nun, es gibt die einfache Erklärung (die ich schätze) und die kleinen Details (die ich auf andere Weise schätze). Sie sind beide gute Antworten.
cbmanica

3
Wie an anderer Stelle erwähnt, android:layout_width="0px"ist wichtig. Außerdem müssen die Gewichte keine ganzen Zahlen sein.
Brian White

Dies ist etwas schwieriger zu verstehen als die ausgewählte Antwort, gibt jedoch die vollständige Antwort - insbesondere, wenn einige Ansichten Gewichte haben und andere nicht. Dies ist ein großer Anwendungsfall, der von der ausgewählten Antwort nicht abgedeckt wird.
Acey

Woher kommt weightSumdann das Bild? Hat es etwas damit zu tun layout_weight?
eRaisedToX

71

Wenn Sie zu den anderen Antworten hinzufügen, ist es am wichtigsten, die Layoutbreite (oder -höhe) auf 0 Pixel festzulegen

android:layout_width="0px"

Andernfalls sehen Sie Müll


Ich denke, es hängt davon ab, ob Sie Ansichten ausblenden möchten, die ihre Gewichtung nicht definieren, oder ob Sie sie mit einer Größe anzeigen möchten, die der Größe entspricht, und den verbleibenden freien Speicherplatz den "gewichteten" Ansichten überlassen möchten.
Andrea Leganza

Was ist, wenn ich sowohl horizontales als auch vertikales Gewicht einstellen muss?
Alston

40

Wenn sich mehrere Ansichten über a erstrecken LinearLayout, erhalten layout_weightSie jeweils eine proportionale Größe. Eine Ansicht mit einem größeren layout_weightWert "wiegt" mehr, sodass sie einen größeren Raum erhält.

Hier ist ein Bild, um die Dinge klarer zu machen.

Geben Sie hier die Bildbeschreibung ein

Theorie

Der Begriff Layoutgewicht bezieht sich auf das Konzept des gewichteten Durchschnitts in der Mathematik. Es ist wie in einer College-Klasse, in der Hausaufgaben 30% wert sind, die Teilnahme 10% wert ist, die Halbzeit 20% wert ist und das Finale 40% wert ist. Wenn Ihre Punkte für diese Teile zusammen gewichtet werden, erhalten Sie Ihre Gesamtnote.

Geben Sie hier die Bildbeschreibung ein

Dies gilt auch für das Layoutgewicht. Die Viewsin einer Horizontalen LinearLayoutkönnen jeweils einen bestimmten Prozentsatz der Gesamtbreite einnehmen. (Oder ein Prozentsatz der Höhe für eine Vertikale LinearLayout.)

Das Layout

Das LinearLayout, was Sie verwenden, sieht ungefähr so ​​aus:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <!-- list of subviews -->

</LinearLayout>

Beachten Sie, dass Sie layout_width="match_parent"für die verwenden müssen LinearLayout. Wenn Sie verwenden wrap_content, wird es nicht funktionieren. Beachten Sie auch, dass layout_weightdies für die Ansichten in RelativeLayouts nicht funktioniert (siehe hier und hier für SO-Antworten zu diesem Problem).

Die Ansichten

Jede Ansicht in einer Horizontalen LinearLayoutsieht ungefähr so ​​aus:

<Button
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1" />

Beachten Sie, dass Sie layout_width="0dp"zusammen mit verwenden müssen layout_weight="1". Das Vergessen verursacht viele neue Benutzerprobleme. (In diesem Artikel finden Sie verschiedene Ergebnisse, die Sie erhalten können, wenn Sie die Breite nicht auf 0 setzen.) Wenn Ihre Ansichten vertikal sind LinearLayout , würden Sie sie layout_height="0dp"natürlich verwenden.

Im Buttonobigen Beispiel habe ich das Gewicht auf 1 gesetzt, aber Sie können eine beliebige Zahl verwenden. Es ist nur die Summe, die zählt. Sie können in den drei Schaltflächenreihen im ersten Bild, das ich gepostet habe, sehen, dass die Zahlen alle unterschiedlich sind, aber da die Proportionen gleich sind, ändern sich die gewichteten Breiten nicht in jeder Zeile. Einige Leute verwenden gerne Dezimalzahlen mit einer Summe von 1, damit in einem komplexen Layout klar ist, wie schwer jedes Teil ist.

Eine letzte Anmerkung. Wenn Sie viele verschachtelte Layouts verwenden layout_weight, kann dies die Leistung beeinträchtigen.

Extra

Hier ist das XML-Layout für das obere Bild:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="android:layout_weight="
        android:textSize="24sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="1" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="2"
            android:text="2" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="1" />

    </LinearLayout>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="android:layout_weight="
        android:textSize="24sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="10"
            android:text="10" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="20"
            android:text="20" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="10"
            android:text="10" />

    </LinearLayout>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="android:layout_weight="
        android:textSize="24sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".25"
            android:text=".25" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".50"
            android:text=".50" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".25"
            android:text=".25" />

    </LinearLayout>

</LinearLayout>

1
Ich frage mich immer, warum mehr Leute keine Bilder posten, die zu ihrem XML passen. Visuals sind viel einfacher zu verstehen als Code.
AleksandrH

30

layout_weightteilt Android mit, wie Sie Ihre Views in einem verteilen können LinearLayout. Android berechnet dann zuerst den Gesamtanteil, der für alle Views erforderlich ist, für die ein Gewicht angegeben wurde, und platziert jedes Viewnach dem Bruchteil des Bildschirms, den es benötigt. Im folgenden Beispiel sieht Android, dass die TextViews ein layout_weightvon haben 0(dies ist die Standardeinstellung) und die EditTexts ein layout_weightvon 2jedem haben, während das Buttonein Gewicht von hat 1. Android weist also "gerade genug" Platz zum Anzeigen zu tvUsernameund tvPasswordteilt dann den Rest der Bildschirmbreite in 5 gleiche Teile auf, von denen zwei zugewiesen sind etUsername, zwei etPasswordund der letzte Teil bLogin:

<LinearLayout android:orientation="horizontal" ...>

    <TextView android:id="@+id/tvUsername" 
    android:text="Username" 
    android:layout_width="wrap_content" ... />

    <EditText android:id="@+id/etUsername"
    android:layout_width="0dp"
    android:layout_weight="2" ... />

    <TextView android:id="@+id/tvPassword"
    android:text="Password"
    android:layout_width="wrap_content" />

    <EditText android:id="@+id/etPassword"
    android:layout_width="0dp"
    android:layout_weight="2" ... />

    <Button android:id="@+id/bLogin"
    android:layout_width="0dp"
    android:layout_weight="1"
    android:text="Login"... />

</LinearLayout>

Es sieht aus wie:
Landschaftsorientierung und
hochkant


Link ist nicht mehr verfügbar. Wenn Sie eine andere gute Referenz haben, aktualisieren Sie diese bitte.
BinaryGuy

16

Denken Sie es so, wird einfacher sein

Wenn Sie 3 Schaltflächen haben und deren Gewichtung dementsprechend 1,3,1 beträgt, funktioniert dies wie eine Tabelle in HTML

Geben Sie 5 Portionen für diese Zeile an: 1 Portion für Taste 1, 3 Portionen für Taste 2 und 1 Portion für Taste 1

Betrachten,


10

Eine der besten Erklärungen für mich war diese (suchen Sie im Android-Tutorial nach Schritt 7) :

layout_weight wird in LinearLayouts verwendet, um Ansichten innerhalb des Layouts "Bedeutung" zuzuweisen. Alle Ansichten haben ein Standard-Layoutgewicht von Null, was bedeutet, dass sie nur so viel Platz auf dem Bildschirm beanspruchen, wie sie angezeigt werden müssen. Wenn Sie einen Wert über Null zuweisen, wird der Rest des verfügbaren Speicherplatzes in der übergeordneten Ansicht entsprechend dem Wert des Layoutgewichts jeder Ansicht und seinem Verhältnis zum Gesamtlayoutgewicht aufgeteilt, das im aktuellen Layout für dieses und andere Ansichtselemente angegeben ist.

Ein Beispiel: Nehmen wir an, wir haben eine Textbeschriftung und zwei Textbearbeitungselemente in einer horizontalen Zeile. Für das Label ist kein layout_weight angegeben, daher nimmt es den zum Rendern erforderlichen Mindestspeicherplatz ein. Wenn das layout_weight jedes der beiden Textbearbeitungselemente auf 1 gesetzt ist, wird die verbleibende Breite im übergeordneten Layout gleichmäßig zwischen ihnen aufgeteilt (da wir behaupten, dass sie gleich wichtig sind). Wenn der erste ein Layoutgewicht von 1 und der zweite ein Layoutgewicht von 2 hat, wird ein Drittel des verbleibenden Platzes dem ersten und zwei Drittel dem zweiten Platz zugewiesen (weil wir behaupten, dass der zweite wichtiger ist).



4

Für zusätzliche

verticalVergessen Sie zur Orientierung nicht, heightauf 0dp zu setzen

android:layout_height="0dp"

horizontalVergessen Sie zur Orientierung nicht, widthauf 0dp zu setzen

android:layout_width="0dp"

3

Bitte sehen Sie sich die weightSum von LinearLayout und das layout_weight jeder Ansicht an. android: weightSum = "4" android: layout_weight = "2" android: layout_weight = "2" Ihre layout_height sind beide 0px, aber ich bin nicht sicher, ob es relevant ist

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:weightSum="4">

<fragment android:name="com.example.SettingFragment"
    android:id="@+id/settingFragment"
    android:layout_width="match_parent"
    android:layout_height="0px"
    android:layout_weight="2"
    />

<Button
    android:id="@+id/dummy_button"
    android:layout_width="match_parent"
    android:layout_height="0px"
    android:layout_weight="2"
    android:text="DUMMY"
    />
</LinearLayout>

Bitte sehen Sie sich die weightSum von LinearLayout und das layout_weight jeder Ansicht an. android: weightSum = "4" android: layout_weight = "2" android: layout_weight = "2" Ihre layout_height sind beide 0px, aber ich bin nicht sicher, ob es relevant ist.
Ming Leung

0

Kombinieren Sie beide Antworten aus

Flo & rptwsthi und roetzi,

Denken Sie daran, Ihre zu ändern layout_width=0dp/px, sonst dielayout_weight Verhalten umgekehrt verhält, wenn die größte Zahl den kleinsten Platz und die niedrigste Zahl den größten Platz belegt.

Außerdem führt eine Kombination von Gewichten dazu, dass ein Layout nicht angezeigt werden kann (da es den Platz über belegt).

Vorsicht davor.


0

Durch Hinzufügen android:autoSizeTextType="uniform"wird die Größe des Texts automatisch für Sie geändert


-1

Wie der Name schon sagt, gibt die Layoutgewichtung an, wie viel oder wie viel Prozent des Speicherplatzes ein bestimmtes Feld oder Widget auf dem Bildschirm belegen soll.
Wenn wir das Gewicht in horizontaler Ausrichtung angeben, müssen wir angeben layout_width = 0px.
Wenn wir das Gewicht in vertikaler Ausrichtung angeben, müssen wir es ebenfalls angeben layout_height = 0px.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.