è possibile distribuire uniformemente i pulsanti sulla larghezza di un linearlayout Android


247

Ho un layout lineare (orientato orizzontalmente) che contiene 3 pulsanti. Voglio che i 3 pulsanti abbiano una larghezza fissa e siano distribuiti uniformemente sulla larghezza del layout lineare.

Posso gestirlo impostando la gravità del linearlayout al centro e quindi regolando l'imbottitura dei pulsanti, ma questo funziona per una larghezza fissa e non funzionerà per cambiare dispositivi o orientamenti.

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


Risposte:


339

Ampliando la risposta di fedj , se si imposta layout_widthper 0dpe impostare il layout_weightper ciascuno dei pulsanti a 1, la larghezza disponibile sarà ripartito in parti uguali tra i pulsanti.


81
Per espanderlo, se non vuoi che la larghezza dei pulsanti sia 1/3 dello schermo, avvolgi ciascun pulsante in un LinearLayout e imposta layout_width = "0dp" e layout_weight = "1" sui 3 LinearLayouts. Inoltre, impostare la gravità sui LinearLayout su "center" in modo che i pulsanti si allineino al centro di ciascun LinearLayout.
Andrew,

questo è solo il caso di linearlayout. qualcuno può dare un'idea di equispacing in relativelayout
user1859771

1
Nel mio caso, uso layout_width = "wrap_content" e solo con layout_weight = "1" funziona bene!
StefanoM5,

Questo non è corretto poiché l'OP vuole essere risolto. Vedi la risposta di Stoefln.
Mitulát báti,

228

Se non si desidera ridimensionare i pulsanti, ma regolare la spaziatura tra i pulsanti (spaziatura uguale tra tutti i pulsanti), è possibile utilizzare le viste con weight = "1" che riempirà lo spazio tra i pulsanti:

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

15
Questo è sicuramente il metodo più semplice e più basso che funziona (nel caso in cui si desideri ridimensionare lo spazio tra le viste, non le viste stesse). Lo sto usando in verticale, quindi ho appena scambiato i valori di larghezza e altezza. Grazie.
Samis,

7
Questa è una soluzione elegante. Potresti preferire utilizzare il Spacetipo di vista. Rende le cose un po 'più leggibili.
Ryan R,

2
Ryan, sì, è se stai usando API 14+ (come dovremmo).
Eduardo Naveda,

Onestamente, ho pensato che non avrebbe funzionato con 4 pulsanti, ma ha funzionato alla grande senza complicazioni e misurazioni del tempo di esecuzione. Rispetto!
Ashraf Alshahawy,

È meglio di quello attualmente accettato come risposta.
DroidHeaven,

25

Puoi usarlo come segue.

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

che dolcezza !! Non ne ho mai sentito parlare Spacefino ad ora
Someone Somewhere

21

Puoi farlo dando sia Viewsa layout_widthdi 0dpche a layout_weightdi 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>

Il modo in cui Android layout_weight funziona è che:

  • in primo luogo, guarda alle dimensioni che una vista normalmente prenderebbe e riserva questo spazio.
  • secondo, se il layout è match_parentallora dividerà lo spazio che rimane nel rapporto di layout_weights. Quindi, se hai dato le viste layout_weight="2"e layout_weight="1", il rapporto risultante sarà 2 a 1, cioè: la prima vista otterrà 2/3 dello spazio rimasto e l'altra vista 1/3.

Pertanto, se si assegna layout_widthuna dimensione del 0dpprimo passaggio non ha alcun significato aggiunto poiché a entrambe le viste non viene assegnato alcuno spazio. Quindi solo il secondo punto decide lo spazio che ognuno Viewriceve, dando così Viewallo spazio specificato in base al rapporto!

Spiegare il motivo per cui 0dplo spazio si divide equamente fornendo un esempio che mostra il contrario: il codice riportato di seguito comporterebbe qualcosa di diverso poiché example textora ha una larghezza maggiore di 0dpperché ha wrap_contentinvece lasciato lo spazio libero da dividere meno del 100% perché il testo occupa spazio. Il risultato sarà che ottengono il 50% dello spazio libero rimasto, ma il testo ha già preso un po 'di spazio, quindi TextViewavrà ben oltre il 50% dello spazio totale.

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

13

Bene, se hai esattamente 3 pulsanti e se è ok (o addirittura pianificato) che i pulsanti esterni sono allineati sul lato sinistro e destro, potresti provare un RelativeLayout che è meno sovraccarico (in molte situazioni).

È possibile utilizzare layout_alignParentBottomper allineare tutti i pulsanti con la parte inferiore del layout. Utilizzare layout_alignParentLeft and Rightper i pulsanti esterni e layout_centerHorizontalper il pulsante centrale.

Funzionerà bene su diversi orientamenti e dimensioni dello schermo.


Per chiarire, questo non funziona se hai più di tre pulsanti.
arlomedia,

Esattamente. Dovresti invece utilizzare un LinearLayout o un RadioGroup (se applicabile).
Marsbear,

11

Dovresti dare un'occhiata ad Android: attributo layout_weight


1
Ho capito che l'attributo layout_weight allungherà la dimensione del pulsante per riempire il layout. Voglio mantenere costante la dimensione dei pulsanti e aumentare solo l'imbottitura tra i pulsanti.
Yamspog,

Ah! Non conosco davvero il modo migliore per farlo. Forse racchiudendo ogni pulsante nel layout. Il layout 3 con attributo layout_weight e il pulsante centrato nel layout. Ma davvero non so se sia il modo migliore per farlo.
fedj,

9

La soluzione moderna per questo è 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>

Assicurati di importare implementation 'com.google.android:flexbox:2.0.0'

Flexboxè molto più potente; è un buon complemento a ConstraintLayout. Questa è un'ottima risorsa per saperne di più.

Differenza tra space_around, space_between e space_evenly


1
grazie per avermi reso (noi) consapevole. Decisamente utile Ho usato "space_around" e i pulsanti erano ben centrati quando avevo 1 o 3 visibili all'interno del FlexBox
Someone Somewhere

4

Per distribuire uniformemente due pulsanti in un layout lineare orizzontale, ho usato 3 oggetti LinearLayout per agire come spazi che verranno ridimensionati automaticamente. Ho posizionato questi oggetti LinearLayout come segue:

[] Button1 [] Button2 []

([] rappresenta un oggetto LinearLayout utilizzato per la spaziatura)

quindi ho impostato ciascuno di questi [] pesi LinearLayout 'su 1, e ho i pulsanti uniformemente distanziati.

Spero che questo ti aiuti.



4

Ti suggerisco di usare l'attributo weightSum di LinearLayout.

Aggiungendo il tag android:weightSum="3"alla dichiarazione xml di LinearLayout e quindi android:layout_weight="1"ai tuoi pulsanti, i 3 pulsanti verranno distribuiti uniformemente.


4

Questo può essere ottenuto assegnando weightad ogni pulsante aggiunto all'interno del contenitore, molto importante per definire l'orientamento orizzontale:

    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);
    }

così possiamo ottenere questo nel nostro dispositivo come risultato:

inserisci qui la descrizione dell'immagine

anche se weightruotiamo il nostro dispositivo il definito in ciascun pulsante può distribuire gli elemenents uniformemente lungo il contenitore:

inserisci qui la descrizione dell'immagine


3

Il miglior approccio è usare TableLayout con android: layout_width = "match_parent" e nelle colonne usa android: layout_weight = "1" per tutte le colonne


2

Le risposte sopra usando layout_did non ha funzionato per me, ma ha funzionato.

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

Ecco come appare sullo schermo,

inserisci qui la descrizione dell'immagine


2

Soprattutto le risposte sono giuste, ma in un caso hai bisogno di funzionalità visibili e sparite, allora questo metodo pragmaticamente funzionerà bene

<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

Bambini ugualmente ponderati

Per creare un layout lineare in cui ogni bambino utilizza la stessa quantità di spazio sullo schermo, imposta android: layout_height di ciascuna vista su "0dp" (per un layout verticale) o android: layout_width di ogni vista su "0dp" ( per un layout orizzontale). Quindi impostare android: layout_weight di ciascuna vista su "1".

Affinché ciò funzioni nel LinearLayoutgruppo di viste, i valori degli attributi per android:layout_widthe android:layout_heightdevono essere uguali a "match_parent"...


Grazie mille amico! Risparmiato un sacco di tempo.
Xonshiz,

1
Nessun problema amico.
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>

In cerchio, si presume che Tom, Tim e Todd siano di 3 centimetri. Se vuoi che sia toccato sullo schermo verso il basso, mettilo come Tom e Tim che si presume siano 1 centimetro, il che significa che combinano virtuale ma il suo piano 2D è in fondo. Questo è visualizzato sullo schermo.


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" />


0

Il modo più semplice e veloce (ma non il migliore) è aggiungere un TextView con attributo di testo vuoto, come questo

android:text=""

il colore di sfondo deve essere lo stesso in LinearLayout, quindi è possibile utilizzare la proprietà padding, in questo modo

android:paddingBottom="250dp"

o qualunque cosa tu abbia bisogno. Ecco un esempio

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.