Antworten:
Mit können layout_weight
Sie ein Größenverhältnis zwischen mehreren Ansichten festlegen. ZB haben Sie ein MapView
und ein, table
das 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_weight
von der map
auf 3 und die layout_weight
von der table
auf 1.
Damit es funktioniert, müssen Sie auch die Höhe oder Breite (abhängig von Ihrer Ausrichtung) auf 0px einstellen.
Kurz gesagt, layout_weight
gibt 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.
Im Allgemeinen lautet die Formel:
Platz, der dem Kind zugewiesen ist = (individuelles Gewicht des Kindes) / (Summe des Gewichts jedes Kindes im linearen Layout)
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)
Angenommen, wir haben eine Textbeschriftung und zwei Textbearbeitungselemente in einer horizontalen Zeile. Das Etikett ist nicht layout_weight
angegeben, daher nimmt es den zum Rendern erforderlichen Mindestspeicherplatz ein. Wenn 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).
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_weight
1 und das zweite eine layout_weight
2 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)
android:layout_width="0px"
ist wichtig. Außerdem müssen die Gewichte keine ganzen Zahlen sein.
weightSum
dann das Bild? Hat es etwas damit zu tun layout_weight
?
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
Wenn sich mehrere Ansichten über a erstrecken LinearLayout
, erhalten layout_weight
Sie jeweils eine proportionale Größe. Eine Ansicht mit einem größeren layout_weight
Wert "wiegt" mehr, sodass sie einen größeren Raum erhält.
Hier ist ein Bild, um die Dinge klarer zu machen.
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.
Dies gilt auch für das Layoutgewicht. Die Views
in einer Horizontalen LinearLayout
können jeweils einen bestimmten Prozentsatz der Gesamtbreite einnehmen. (Oder ein Prozentsatz der Höhe für eine Vertikale LinearLayout
.)
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_weight
dies für die Ansichten in RelativeLayouts nicht funktioniert (siehe hier und hier für SO-Antworten zu diesem Problem).
Jede Ansicht in einer Horizontalen LinearLayout
sieht 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 Button
obigen 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.
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>
layout_weight
teilt Android mit, wie Sie Ihre View
s in einem verteilen können LinearLayout
. Android berechnet dann zuerst den Gesamtanteil, der für alle View
s erforderlich ist, für die ein Gewicht angegeben wurde, und platziert jedes View
nach dem Bruchteil des Bildschirms, den es benötigt. Im folgenden Beispiel sieht Android, dass die TextView
s ein layout_weight
von haben 0
(dies ist die Standardeinstellung) und die EditText
s ein layout_weight
von 2
jedem haben, während das Button
ein Gewicht von hat 1
. Android weist also "gerade genug" Platz zum Anzeigen zu tvUsername
und tvPassword
teilt dann den Rest der Bildschirmbreite in 5 gleiche Teile auf, von denen zwei zugewiesen sind etUsername
, zwei etPassword
und 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:
und
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,
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).
http://developer.android.com/guide/topics/ui/layout-objects.html#linearlayout
layout_weight definiert, wie viel Speicherplatz das Steuerelement jeweils für andere Steuerelemente erhalten muss.
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>
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.
Durch Hinzufügen android:autoSizeTextType="uniform"
wird die Größe des Texts automatisch für Sie geändert
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
.