it-swarm.com.de

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

Ich habe ein lineares Layout (horizontal ausgerichtet), das 3 Schaltflächen enthält. Ich möchte, dass die 3 Knöpfe 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 die Mitte einstellen und dann die Polsterung der Tasten anpasse. Dies funktioniert jedoch für eine feste Breite und funktioniert nicht für das Ä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>
212
yamspog

Wenn Sie layout_width auf 0dp setzen und den layout_weight für jede der Schaltflächen auf 1 setzen, wird die Antwortbreite auf fedj erweitert , und die verfügbare Breite wird zwischen den Schaltflächen gleichmäßig aufgeteilt.

295
Dan Dyer

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 fü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>
194
stoefln

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>
20
Sandhu

Sie können dies tun, indem Sie Views einen layout_width von 0dp und einen layout_weight von 1 angeben:

<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 Funktionsweise von Android-Layout ist:  

  • zunächst wird die Größe berücksichtigt, die eine Ansicht normalerweise annehmen würde, und reserviert diesen Platz.
  • zweitens, wenn das Layout match_parent ist, teilt es den Raum, der übrig bleibt im Verhältnis der layout_weights. Wenn Sie also die Ansichten layout_weight="2" und layout_weight="1" angeben, beträgt das Verhältnis 2 zu 1, das heißt: Die erste Ansicht erhält 2/3 des verbleibenden Bereichs und die andere Ansicht 1/3.

Wenn Sie also layout_width eine Größe von 0dp angeben, hat der erste Schritt keine zusätzliche Bedeutung, da beiden Ansichten kein Platz zugewiesen wird. Dann bestimmt nur der zweite Punkt den Speicherplatz, den jeder View erhält, und gibt dem Views den von Ihnen angegebenen Speicherplatz entsprechend dem Verhältnis! 

Um zu erklären, warum 0dp das Leerzeichen gleichmäßig verteilt, indem Sie ein Beispiel bereitstellen, das das Gegenteil zeigt: Der folgende Code würde zu etwas anderem führen, da example text jetzt eine Breite hat, die größer ist als 0dp, da er wrap_content statt des freien Codes hat Platz, um weniger als 100% zu teilen, da der Text Platz benötigt. Das Ergebnis ist, dass sie 50% des freien Speicherplatzes erhalten, der Text jedoch bereits Speicherplatz beanspruchte, sodass TextView weit über 50% des gesamten Speicherplatzes vorhanden ist.

<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>
18
Joop

Wenn Sie genau 3 Tasten haben und die äußeren Tasten auf der linken und rechten Seite ausgerichtet sind (oder sogar geplant sind), möchten Sie vielleicht ein RelativeLayout ausprobieren, das (in vielen Situationen) weniger Overhead ist.

Sie können layout_alignParentBottom verwenden, um alle Schaltflächen am unteren Rand des Layouts auszurichten. Verwenden Sie layout_alignParentLeft and Right für die äußeren Schaltflächen und layout_centerHorizontal für die mittlere Schaltfläche.

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

13
marsbear

Sie sollten einen Blick auf Android: layout_weight-Attribut werfen

11
fedj

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

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

4
matdev

ich habe eine benutzerdefinierte Ansicht DistributeLayout erstellt, um dies zu tun.

4
martyglaubitz

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 angepasst wird. Ich habe diese LinearLayout-Objekte wie folgt positioniert:

[] Taste1 [] Taste2 []

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

dann setze ich die Gewichte dieser [] LinearLayout-Objekte auf 1, und ich bekomme gleichmäßig verteilte Schaltflächen.

Hoffe das hilft.

4
Muhammad

Dies kann durch Zuweisen von weight zu jeder im Container hinzugefügten Schaltfläche erreicht werden. 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 unserem Gerät als Ergebnis erhalten:

 enter image description here

selbst wenn wir unser Gerät drehen, kann der in jeder Schaltfläche definierte weight die Elemente auf dem Container gleichmäßig verteilen:

 enter image description here

4
Elenasys

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

3
Prashant

Der einfachste und schnellste Weg (aber nicht der beste) besteht darin, eine TextView mit leerem Textattribut hinzuzufügen

Android:text=""

die Hintergrundfarbe muss im LinearLayout die gleiche sein, dann können Sie die Eigenschaft padding verwenden 

Android:paddingBottom="250dp"

oder was auch immer Sie brauchen . Hier ist ein Beispiel.

2
Cesar Bobadilla

Gleichgewichtige Kinder

Zum Erstellen eines linearen Layouts, in dem jedes Kind dieselbe Menge von .__ verwendet. Platz auf dem Bildschirm, stellen Sie Android: layout_height jeder Ansicht auf "0dp" (für ein vertikales Layout) oder Android: layout_width jeder Ansicht auf "0dp" (für ein horizontales Layout). Stellen Sie dann das Android ein: layout_weight von jeder Ansicht auf "1".

Damit dies in der Sichtgruppe LinearLayout funktioniert, müssen die Attributwerte für Android:layout_width und Android:layout_height gleich "match_parent"... sein.

2
Gibran Castillo

Die Antworten sind vor allem richtig, aber in einem Fall, in dem Sie sichtbare und weggelassene 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;
    }
}
2
Rajesh Nasit

Die obigen Antworten mit layout_did funktionierten nicht für mich, aber die folgenden waren erfolgreich.

<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,

 enter image description here

2
sean le roy
<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" />

1
basem
<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 Touchscreen handelt, geben Sie an, dass Tom und Tim einen Zentimeter angenommen haben. Dies bedeutet, dass sie virtuell sind, die 2D-Ebene jedoch unten ist. Dies wird auf dem Bildschirm angezeigt.

0
Dinesh Gowd