Ist es möglich, Schaltflächen gleichmäßig über die Breite eines linearen Android-Layouts zu verteilen?

247

Ich habe ein lineares Layout (horizontal ausgerichtet), das 3 Schaltflächen enthält. Ich möchte, dass die 3 Schaltflächen eine feste Breite haben und gleichmäßig über die Breite des linearen Layouts verteilt sind.

Ich kann dies erreichen, indem ich die Schwerkraft des linearen Layouts auf Mitte stelle und dann die Polsterung der Tasten anpasse. Dies funktioniert jedoch bei einer festen Breite und nicht beim Ändern von Geräten oder Ausrichtungen.

<LinearLayout android:id="@+id/LinearLayout01" 
android:layout_height="wrap_content" 
android:orientation="horizontal" 
android:layout_width="fill_parent" 
android:gravity="center">

<Button 
android:id="@+id/btnOne"
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:width="120dip"></Button>

<Button 
android:id="@+id/btnTwo"
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:width="120dip"></Button>


<Button 
android:id="@+id/btnThree"
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:width="120dip"></Button>

</LinearLayout>
Yamspog
quelle

Antworten:

339

Aufbauend auf Fedj Antwort , wenn Sie setzen layout_widthauf 0dpund setzen layout_weightfür jede der Tasten 1, die zur Verfügung stehende Breite zwischen den Tasten gleichmäßig geteilt werden.

Dan Dyer
quelle
81
Wenn Sie nicht möchten, dass die Breite der Schaltflächen 1/3 des Bildschirms beträgt, wickeln Sie jede Schaltfläche in ein LinearLayout ein und setzen Sie layout_width = "0dp" und layout_weight = "1" für die 3 LinearLayouts. Stellen Sie außerdem die Schwerkraft in den LinearLayouts auf "Mitte", damit die Schaltflächen in der Mitte jedes LinearLayouts ausgerichtet werden.
Andrew
Dies ist nur für lineares Layout der Fall. Kann jemand eine Idee für die Gleichverteilung im relativen
Layout
1
In meinem Fall verwende ich layout_width = "wrap_content" und nur mit layout_weight = "1" funktioniert gut!
StefanoM5
Dies ist nicht korrekt, da das OP mit behoben werden möchte. Siehe die Antwort von stoefln.
Mitulát báti
228

Wenn Sie nicht möchten, dass die Schaltflächen skaliert werden, sondern den Abstand zwischen den Schaltflächen anpassen (gleicher Abstand zwischen allen Schaltflächen), können Sie Ansichten mit weight = "1" verwenden, die den Abstand zwischen den Schaltflächen ausfüllen:

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

    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:background="@null"
        android:gravity="center_horizontal|center_vertical"
        android:src="@drawable/tars_active" />

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

    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:background="@null"
        android:gravity="center_horizontal|center_vertical"
        android:src="@drawable/videos_active" />

    <Space
        android:layout_width="0dp"
        android:layout_height="1dp"
        android:layout_weight="1" >
    </Space>
stoefln
quelle
15
Dies ist definitiv die einfachste Methode mit dem geringsten Overhead (für den Fall, dass der Abstand zwischen den Ansichten skaliert werden soll, nicht die Ansichten selbst). Ich verwende es vertikal und habe daher nur die Werte für Breite und Höhe vertauscht. Vielen Dank.
Samis
7
Dies ist eine elegante Lösung. Möglicherweise bevorzugen Sie die Verwendung des SpaceAnsichtstyps. Macht die Dinge etwas lesbarer.
Ryan R
2
Ryan, ja, wenn Sie API 14+ verwenden (wie wir sollten).
Eduardo Naveda
Ehrlich gesagt dachte ich, dass es nicht funktionieren wird, wenn 4 Tasten vorhanden sind, aber es funktioniert hervorragend ohne viel Aufhebens und Laufzeitmessung. Respekt!
Ashraf Alshahawy
Dies ist besser als die, die derzeit als Antwort akzeptiert wird.
DroidHeaven
25

Sie können es wie folgt verwenden.

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_marginTop="15dp">
    <Space
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Save"/>
    <Space
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Reset"/>
    <Space
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="cancel"/>
    <Space
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"/>
</LinearLayout>
Sandhu
quelle
das ist süß !! Ich habe Spacebis jetzt noch nie davon gehört
Jemand irgendwo
21

Sie können dies tun, indem Sie sowohl Viewsa layout_widthvon 0dpals auch a layout_weightvon angeben 1:

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

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

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

</LinearLayout>

Die Art und Weise, wie android layout_weight funktioniert, ist folgende:

  • Erstens sieht es nach der Größe aus, die eine Ansicht normalerweise annehmen würde, und reserviert diesen Platz.
  • Zweitens, wenn das Layout ist match_parent, wird der verbleibende Raum im Verhältnis von layout_weights geteilt. Wenn Sie also die Ansichten layout_weight="2"und layout_weight="1"angegeben haben, beträgt das resultierende Verhältnis 2 zu 1, dh die erste Ansicht erhält 2/3 des verbleibenden Platzes und die andere Ansicht 1/3.

Wenn Sie also layout_widtheine Größe für 0dpden ersten Schritt angeben, hat dies keine zusätzliche Bedeutung, da beiden Ansichten kein Leerzeichen zugewiesen ist. Dann entscheidet nur der zweite Punkt über den Platz, den jeder Viewerhält, und gibt dem Views den Raum, den Sie entsprechend dem Verhältnis angegeben haben!

Um zu erklären, warum 0dpder Speicherplatz gleichmäßig aufgeteilt wird, geben Sie ein Beispiel, das das Gegenteil zeigt: Der folgende Code würde zu etwas anderem führen, da example textdie Breite jetzt größer ist als 0dpweil wrap_contentder freie Speicherplatz weniger als 100% geteilt werden muss weil der Text Platz braucht. Das Ergebnis wird sein , dass sie 50% des freien Raums erhalten tun übrig , als der Text hat schon etwas Platz , so dass die TextViewhaben weit über 50% der Gesamtfläche.

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

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

    <TextView
        android:layout_width="wrap_content"
        android:text="example text"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>

</LinearLayout>
Joop
quelle
13

Wenn Sie genau 3 Schaltflächen haben und es in Ordnung (oder sogar geplant) ist, dass die äußeren Schaltflächen nach links und rechts ausgerichtet sind, sollten Sie ein RelativeLayout ausprobieren, das (in vielen Situationen) weniger Aufwand bedeutet.

Sie können layout_alignParentBottomalle Schaltflächen am unteren Rand des Layouts ausrichten. Verwenden Sie layout_alignParentLeft and Rightfür die äußeren Tasten und layout_centerHorizontalfür die mittlere Taste.

Das funktioniert gut bei verschiedenen Ausrichtungen und Bildschirmgrößen.

Marsbär
quelle
Zur Verdeutlichung funktioniert dies nicht, wenn Sie mehr als drei Schaltflächen haben.
Arlomedia
Genau. Sie müssten stattdessen ein LinearLayout oder eine RadioGroup (falls zutreffend) verwenden.
Marsbear
11

Sie sollten einen Blick auf das Attribut android: layout_weight werfen

fedj
quelle
1
Nach meinem Verständnis wird das Attribut layout_weight die Größe der Schaltfläche erweitern, um das Layout zu füllen. Ich möchte die Größe der Tasten konstant halten und nur den Abstand zwischen den Tasten erhöhen.
Yamspog
Ah! Ich weiß nicht wirklich, wie ich es am besten machen soll. Vielleicht jede Schaltfläche in das Layout einschließen. Das 3-Layout mit dem Attribut layout_weight und der im Layout zentrierten Schaltfläche. Aber ich weiß wirklich nicht, ob es der beste Weg ist, es zu tun.
Fedj
9

Die moderne Lösung hierfür ist Flexbox .

<com.google.android.flexbox.FlexboxLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:justifyContent="space_around"> <!-- or "space_between", "space_evenly" -->

    <Button 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:width="120dp" />

    <Button 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:width="120dp" />

    <Button 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:width="120dp" />
</com.google.android.flexbox.FlexboxLayout>

Stellen Sie sicher, dass Sie importieren implementation 'com.google.android:flexbox:2.0.0'

Flexboxist weitaus mächtiger; es ist eine gute Ergänzung zu ConstraintLayout. Dies ist eine großartige Ressource , um mehr zu erfahren.

Unterschied zwischen space_around, space_between und space_evenly

Gibolt
quelle
1
Danke, dass du mich (uns) darauf aufmerksam gemacht hast. Auf jeden Fall nützlich. Ich habe "space_around" verwendet und die Schaltflächen waren gut zentriert, als ich 1 oder 3 in der FlexBox
Someone Somewhere
4

Um zwei Schaltflächen in einem horizontalen linearen Layout gleichmäßig zu verteilen, habe ich 3 LinearLayout-Objekte verwendet, um als Leerzeichen zu fungieren, deren Größe automatisch geändert wird. Ich habe diese LinearLayout-Objekte wie folgt positioniert:

[] Button1 [] Button2 []

([] steht für ein LinearLayout-Objekt, das für den Abstand verwendet wird.)

Dann setze ich die Gewichte jedes dieser [] LinearLayout-Objekte auf 1 und erhalte gleichmäßig verteilte Schaltflächen.

Hoffe das hilft.

Muhammad
quelle
4

Ich schlage vor, dass Sie das weightSum-Attribut von LinearLayout verwenden.

Wenn Sie das Tag android:weightSum="3"zur XML-Deklaration Ihres LinearLayout und dann android:layout_weight="1"zu Ihren Schaltflächen hinzufügen, werden die drei Schaltflächen gleichmäßig verteilt.

matdev
quelle
4

Dies kann erreicht werden, indem weightjeder im Container hinzugefügten Schaltfläche zugewiesen wird. Dies ist sehr wichtig, um die horizontale Ausrichtung zu definieren:

    int buttons = 5;

    RadioGroup rgp = (RadioGroup) findViewById(R.id.radio_group);

    rgp.setOrientation(LinearLayout.HORIZONTAL);

    for (int i = 1; i <= buttons; i++) {
        RadioButton rbn = new RadioButton(this);         
        rbn.setId(1 + 1000);
        rbn.setText("RadioButton" + i);
        //Adding weight
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 1f);
        rbn.setLayoutParams(params);
        rgp.addView(rbn);
    }

So können wir dies in unser Gerät als Ergebnis bekommen:

Geben Sie hier die Bildbeschreibung ein

Selbst wenn wir unser Gerät drehen, können die weightin jedem Knopf definierten Elemente die Elemente gleichmäßig entlang des Containers verteilen:

Geben Sie hier die Bildbeschreibung ein

Jorgesys
quelle
3

Am besten verwenden Sie TableLayout mit android: layout_width = "match_parent" und in Spalten android: layout_weight = "1" für alle Spalten

Prashant
quelle
2

Die obigen Antworten mit layout_did haben bei mir nicht funktioniert, aber die folgenden haben funktioniert.

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_weight="0.1"
    android:layout_gravity="center_horizontal"
    >

    <android.support.design.widget.FloatingActionButton
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_gravity="center"
       />

    <android.support.design.widget.FloatingActionButton
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_gravity="center"
        android:layout_marginLeft="40dp"
        android:layout_marginStart="40dp"/>

    <android.support.design.widget.FloatingActionButton
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_gravity="center"
        android:layout_marginLeft="40dp"
        android:layout_marginStart="40dp"
        />

    <android.support.design.widget.FloatingActionButton
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_gravity="center"
        android:layout_marginLeft="40dp"
        android:layout_marginStart="40dp"/>

</LinearLayout>

So sieht es auf dem Bildschirm aus,

Geben Sie hier die Bildbeschreibung ein

Sean Le Roy
quelle
2

Vor allem die Antworten sind richtig, aber in einem Fall, in dem Sie sichtbare und verschwundene Funktionen benötigen, funktioniert diese pragmatische Methode gut

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

        <Button
            android:id="@+id/btnOne"
            android:layout_width="120dp"
            android:layout_height="match_parent"></Button>

        <Button
            android:id="@+id/btnTwo"
            android:layout_width="120dp"
            android:layout_height="match_parent"></Button>


        <Button
            android:id="@+id/btnThree"
            android:layout_width="120dp"
            android:layout_height="match_parent"></Button>
    </LinearLayout>



 float width=CommonUtills.getScreenWidth(activity);
            int cardWidth=(int)CommonUtills.convertDpToPixel (((width)/3),activity);

LinearLayout.LayoutParams params =
                new LinearLayout.LayoutParams(width,
                        LinearLayout.LayoutParams.MATCH_PARENT);

btnOne.setLayoutParams(params);
btnTwo.setLayoutParams(params);
btnThree.setLayoutParams(params);

public class CommonUtills {
public static float getScreenWidth(Context context) {
        float width = (float) 360.0;
        DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
        width = displayMetrics.widthPixels / displayMetrics.density;
        return width;
    }
}
Rajesh Nasit
quelle
2

Gleichgewichtige Kinder

Um ein lineares Layout zu erstellen, in dem jedes Kind den gleichen Platz auf dem Bildschirm verwendet, setzen Sie die android: layout_height jeder Ansicht auf "0dp" (für ein vertikales Layout) oder die android: layout_width jeder Ansicht auf "0dp" ( für ein horizontales Layout). Setzen Sie dann das android: layout_weight jeder Ansicht auf "1".

Um dies zu Arbeit in der LinearLayoutAnsicht Gruppe die Attributwerte für android:layout_widthund android:layout_heightsein müssen gleich "match_parent"...

Gibran Castillo
quelle
Vielen Dank Kumpel! Viel Zeit gespart.
Xonshiz
1
Kein Problem, Kumpel.
Gibran Castillo
0
<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:text="Tom"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="24sp" 
        android:layout_weight="3"/>

    <TextView
        android:text="Tim"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="24sp"
        android:layout_weight="3"/>

    <TextView
        android:text="Todd"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="24sp" 
        android:layout_weight="3"/>

</LinearLayout>

Im Kreis werden Tom, Tim und Todd mit 3 Zentimetern angenommen. Wenn Sie möchten, dass es sich um einen Touchdown-Bildschirm handelt, geben Sie an, dass Tom und Tim 1 Zentimeter betragen. Dies bedeutet, dass sie virtuell kombiniert werden, die 2D-Ebene jedoch unten liegt. Dies wird auf dem Bildschirm angezeigt.

Dinesh Gowd
quelle
0
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<TextView
    android:text="Tom"
    android:layout_width="wrap_content"
    android:layout_height="200dp"
    android:textSize="24sp" />

<TextView
    android:text="Tim"
    android:layout_width="wrap_content"
    android:layout_height="200dp"
    android:textSize="24sp" />

<TextView
    android:text="Todd"
    android:layout_width="wrap_content"
    android:layout_height="200dp"
    android:textSize="24sp" />

basem
quelle
0

Der einfachste und schnellste Weg (aber nicht der beste) besteht darin, eine Textansicht mit einem leeren Textattribut wie diesem hinzuzufügen

android:text=""

Die Hintergrundfarbe muss im LinearLayout identisch sein, dann können Sie die Auffüllungseigenschaft wie folgt verwenden

android:paddingBottom="250dp"

oder was auch immer du brauchst. Hier ist ein Beispiel.

Cesar Bobadilla
quelle