Lineares Layout und Gewicht in Android


261

Ich habe immer über diesen lustigen Gewichtswert in den Android-Dokumentationen gelesen. Jetzt möchte ich es zum ersten Mal versuchen, aber es funktioniert überhaupt nicht.

So wie ich es aus den Dokumentationen verstehe, ist dieses Layout:

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

     <Button
        android:text="Register"
        android:id="@+id/register"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dip"
        weight="1" />

     <Button
        android:text="Not this time"
        android:id="@+id/cancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dip"
        weight="1" />

  </LinearLayout>

sollte zwei Schaltflächen erstellen, die horizontal ausgerichtet sind und den Raum gleichmäßig teilen. Das Problem ist, dass die beiden Schaltflächen nicht wachsen, um den Raum zu füllen.

Ich möchte, dass die Schaltflächen wachsen und die gesamte Zeile ausfüllen. Wenn beide Schaltflächen so eingestellt sind, dass sie mit der übergeordneten Schaltfläche übereinstimmen, wird nur die erste Schaltfläche angezeigt und füllt die gesamte Zeile aus.


Update: Android Prozent Support kann dies auch sehr gut. code2concept.blogspot.in/2015/08/…
nitesh

Antworten:


159

Sie legen die layout_weightEigenschaft nicht fest. Ihr Code liest weight="1"und sollte lesen android:layout_weight="1".


684

3 Dinge zu beachten:

  • setze die android: layout_width der Kinder auf "0dp"
  • setze die android: weightSum des Elternteils ( edit: wie Jason Moore bemerkt hat, ist dieses Attribut optional, da es standardmäßig auf die Summe layout_weight der Kinder gesetzt ist)
  • Stellen Sie den Android: layout_weight jedes Kindes proportional ein (zB weightSum = "5", drei Kinder: layout_weight = "1", layout_weight = "3", layout_weight = "1")

Beispiel:

    <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:weightSum="5">

    <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="3"
        android:text="2" />

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

    </LinearLayout>

Und das Ergebnis:

Beispiel für das Layoutgewicht


66
Vielen Dank für den Tipp zum Setzen der Breite auf Null. Ich fand auch, dass das Festlegen von weightSum für das übergeordnete Element nicht erforderlich war.
Jason Moore

30
Gut zu wissen, danke. In diesem Fall kann das Festlegen der weightSum weiterhin hilfreich sein, wenn die Kinder nicht 100% des übergeordneten Elements ausfüllen sollen.
Anke

13
Dies ist für statische XML-Layouts korrekt. Wenn Sie Ansichten zur Laufzeit dynamisch hinzufügen, müssen Sie addView mit Layoutparametern wie addView(button, new LinearLayout.LayoutParams(0, height, 1));Dies verwenden, auch wenn Sie Layouts mit den richtigen Werten für Breite und Gewicht aufblasen.
Kleiber

Sie sagen, setzen Sie den Android: weightSum des Elternteils - setzen Sie ihn auf einen Wert oder geben Sie ihn einfach ein. Wie soll das eingestellt werden?
TheJerm

1
@batbrat ist korrekt, ich habe die Benutzeroberfläche dynamisch generiert. Manchmal behandle ich XML-Fragmente als Vorlagen und ändere oder fülle sie zur Laufzeit. Dieser Trick hat in diesem Fall bei mir nicht funktioniert. Ich musste die explizite Breite und das Gewicht neu einstellen, damit er funktioniert.
Kleiber

52

Es ist android:layout_weight. Gewicht kann nur in verwendet werden LinearLayout. Wenn die Ausrichtung des linearen Layouts vertikal ist, verwenden Sie android:layout_height="0dp"und wenn die Ausrichtung horizontal ist, verwenden Sie android:layout_width = "0dp". Es wird perfekt funktionieren.



16

Versuchen Sie, layout_widthbeide Tasten auf "0dip" und beide Tasten auf "0dip" weightzu stellen0.5


Jetzt sind beide Tasten vom Bildschirm verschwunden
Janusz

Okay, dann setzen Sie die Layoutbreite auf beide auf fill_parent und die Gewichte auf 0,5
jqpubliq

Schau dir das und das an . Ich bin ein wenig verwirrt darüber, warum dies immer noch nicht funktioniert, aber vielleicht gibt Ihnen dies einige Ideen.
jqpubliq

7

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 ist Null

Berechnung, um verbleibenden / zusätzlichen Platz zwischen den Kindern zuzuweisen . (nicht der gesamte Raum)

Leerzeichen für Kind zuweisen = (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 / zusätzliche Speicherplatz zugewiesen

1st text box = 1/(1+1+0) 
2nd text box = 1/(1+1+0) 
3rd text box = 0/(1+1+0) 

Beispiel (2) : 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).

calculation : 
1st label = 0/(0+1+1) 
2nd text box = 1/(0+1+1) 
3rd text box = 1/(0+1+1)

Wenn das erste Textfeld ein Layoutgewicht von 1 und das zweite Textfeld ein Layoutgewicht von 2 hat, wird ein Drittel des verbleibenden Platzes dem ersten und zwei Drittel dem zweiten Platz zugewiesen (weil wir behaupten, das zweite ist wichtiger).

calculation : 
1st label = 0/(0+1+2) 
2nd text box = 1/(0+1+2) 
3rd text box = 2/(0+1+2) 

7

Im Breitenfeld der Taste, ersetzen wrap-contentmit 0dp.
Verwenden Sie das Attribut layout_weight einer Ansicht.

android:layout_width="0dp"  

So sieht Ihr Code aus:

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

 <Button
    android:text="Register"
    android:id="@+id/register"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:padding="10dip"
    android:layout_weight="1" />

 <Button
    android:text="Not this time"
    android:id="@+id/cancel"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:padding="10dip"
    android:layout_weight="1" />    

</LinearLayout>

layout_weight wird verwendet, um den verbleibenden Platz in Proportionen zu verteilen. In diesem Fall nehmen die beiden Schaltflächen die Breite "0dp" an. Der verbleibende Raum wird also im Verhältnis 1: 1 aufgeteilt, dh der Raum wird gleichmäßig auf die Schaltflächenansichten aufgeteilt.


6

Wie Antwort von @Manoj Seelan

Ersetzen Sie android:layout_weightmit android:weight.

Wenn Sie Gewicht mit verwenden LinearLayout. Sie müssen hinzufügen weightSumin LinearLayoutund nach Ausrichtung Ihres LinearLayoutmüssen Sie Einstellung 0dpfür Breite / Höhe zu allen LinearLayout`s Kinder Blick

Beispiel:

Wenn die Ausrichtung von Linearlayoutist Vertical, dann legen Sie die Breite aller LinearLayoutuntergeordneten Ansichten von mit fest0dp

 <LinearLayout
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="vertical"
     android:weightSum="3">

     <Button
        android:text="Register"
        android:id="@+id/register"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:padding="10dip"
        android:layout_weight="2" />

     <Button
        android:text="Not this time"
        android:id="@+id/cancel"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:padding="10dip"
        android:layout_weight="1" />

  </LinearLayout>

Wenn die Ausrichtung Linearlayoutvon ist horizontal, dann stellen Sie die Höhe aller LinearLayoutKinderansichten mit ein 0dp.

 <LinearLayout
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal"
     android:weightSum="3">

     <Button
        android:text="Register"
        android:id="@+id/register"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:padding="10dip"
        android:layout_weight="2" />

     <Button
        android:text="Not this time"
        android:id="@+id/cancel"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:padding="10dip"
        android:layout_weight="1" />

  </LinearLayout>

5

Vielleicht reicht es, wenn Sie die beiden Eigenschaften layout_width der Schaltflächen auf "fill_parent" setzen.

Ich habe gerade diesen Code getestet und er funktioniert im Emulator:

<LinearLayout android:layout_width="fill_parent"
          android:layout_height="wrap_content">

    <Button android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="hello world"/>

    <Button android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="goodbye world"/>

</LinearLayout>

Stellen Sie sicher, dass layout_width auf beiden Schaltflächen auf "fill_parent" gesetzt ist.


1
Dadurch wird nur die rechte Taste aus dem Bildschirm gedrückt und nur die erste Taste angezeigt.
Janusz

4
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/logonFormButtons"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:baselineAligned="true"       
        android:orientation="horizontal">

        <Button
            android:id="@+id/logonFormBTLogon"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"            
            android:text="@string/logon"
            android:layout_weight="0.5" />

        <Button
            android:id="@+id/logonFormBTCancel"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"            
            android:text="@string/cancel"
            android:layout_weight="0.5" />
    </LinearLayout>

Jetzt würde ich lieber vorschlagen, layout_weight = "50" und layout_width = "0px" zu verwenden
Yar

2

Stellen Sie im obigen XML android:layout_weightdas lineare Layout wie folgt ein 2: android:layout_weight="2"


3
Warum wird das benötigt? Warum ist das Layoutgewicht von 2 wichtig? Warum nicht 20 oder 200?
Conrad Frix

2

Außerdem müssen Sie dies android:layout_width="0dp"für untergeordnete Ansichten [Schaltflächenansichten] von hinzufügenLinerLayout


2

Du musst so schreiben, dass es für mich funktioniert

<LinearLayout
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:orientation="horizontal"
            android:weightSum="2">

         <Button
            android:text="Register"
            android:id="@+id/register"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dip"
            android:layout_weight="1" />

         <Button
            android:text="Not this time"
            android:id="@+id/cancel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dip"
            android:layout_weight="1" />

2

Nachfolgend finden Sie die Änderungen (in Fettdruck markiert ) in Ihrem Code:

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

     <Button
        android:text="Register"
        android:id="@+id/register"
        android:layout_width="0dp" //changes made here
        android:layout_height="wrap_content"
        android:padding="10dip"
        android:layout_weight="1" /> //changes made here

     <Button
        android:text="Not this time"
        android:id="@+id/cancel"
        android:layout_width="0dp" //changes made here
        android:layout_height="wrap_content"
        android:padding="10dip"
        android:layout_weight="1" /> //changes made here

  </LinearLayout>

Da Ihr LinearLayout horizontal ausgerichtet ist, müssen Sie Ihre Breite nur auf 0 dp beschränken. für die Verwendung von Gewichten in dieser Richtung. (Wenn Ihre Ausrichtung vertikal wäre, hätten Sie Ihre Höhe nur 0 dp gehalten) .

Da es 2 Ansichten gibt und Sie android:layout_weight="1"für beide Ansichten platziert haben, bedeutet dies, dass die beiden Ansichten gleichmäßig in horizontaler Richtung (oder nach Breite) geteilt werden.


1
 <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:text="Button 1" />

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:text="Button 2" />

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:text="Button 3" />

    </LinearLayout>

0

Dies ist die perfekte Antwort auf Ihr Problem

  <LinearLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:orientation="horizontal"  >   
     <Button 
        android:text="Register" android:id="@+id/register"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:padding="10dip" weight="1" />
     <Button 
        android:text="Not this time" android:id="@+id/cancel"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:padding="10dip" weight="1" />
  </LinearLayout>

3
Also ist es "weight" oder "layout_weight"?
IgorGanapolsky

Es ist android: layout_weight
Mahendra Gunawardena


0
 <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:background="#008">

            <RelativeLayout
                android:id="@+id/paneltamrin"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="center"

                >
                <Button
                    android:id="@+id/BtnT1"
                    android:layout_width="wrap_content"
                    android:layout_height="150dp"
                    android:drawableTop="@android:drawable/ic_menu_edit"
                    android:drawablePadding="6dp"
                    android:padding="15dp"
                    android:text="AndroidDhina"
                    android:textColor="#000"
                    android:textStyle="bold" />
            </RelativeLayout>

            <RelativeLayout
                android:id="@+id/paneltamrin2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="center"
                >
                <Button
                    android:layout_width="wrap_content"
                    android:layout_height="150dp"
                     android:drawableTop="@android:drawable/ic_menu_edit"
                    android:drawablePadding="6dp"
                    android:padding="15dp"
                    android:text="AndroidDhina"
                    android:textColor="#000"
                    android:textStyle="bold" />

            </RelativeLayout>
        </LinearLayout>

Geben Sie hier die Bildbeschreibung ein

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.