Layout lineare e peso in Android


262

Ho sempre letto di questo divertente valore di peso nelle documentazioni di Android. Ora voglio provarlo per la prima volta ma non funziona affatto.

Come ho capito dalle documentazioni questo 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>

dovrebbe creare due pulsanti allineati orizzontalmente e condividere lo spazio equamente. Il problema è che i due pulsanti non crescono per riempire lo spazio.

Vorrei che i pulsanti crescessero e riempissero l'intera linea. Se entrambi i pulsanti sono impostati in modo da corrispondere solo al genitore, viene mostrato il primo pulsante e riempie l'intera riga.


aggiornamento: il supporto percentuale Android può anche fare molto bene. code2concept.blogspot.in/2015/08/…
nitesh

Risposte:


160

Non stai impostando la layout_weightproprietà. Il tuo codice legge weight="1"e dovrebbe leggere android:layout_weight="1".


684

3 cose da ricordare:

  • imposta android: layout_width dei bambini su "0dp"
  • imposta android: weightSum del genitore ( modifica: come notato da Jason Moore, questo attributo è facoltativo, perché di default è impostato sulla somma layout_weight dei bambini)
  • imposta Android: layout_weight di ogni bambino in modo proporzionale (es. weightSum = "5", tre figli: layout_weight = "1", layout_weight = "3", layout_weight = "1")

Esempio:

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

E il risultato:

Esempio di peso del layout


66
Grazie per il suggerimento su come impostare la larghezza a zero. Ho anche scoperto che non era necessario impostare weightSum sul genitore.
Jason Moore,

30
Buono a sapersi, grazie. In tal caso, l'impostazione di weightSum può essere ancora utile quando non si desidera che i bambini riempiano il 100% del genitore.
Anke,

13
Questo è corretto per i layout XML statici. Se aggiungi visualizzazioni in modo dinamico in fase di esecuzione, dovrai utilizzare addView con parametri di layout come addView(button, new LinearLayout.LayoutParams(0, height, 1));Questo è vero anche se stai gonfiando layout con i valori di larghezza e peso corretti.
Sitta

Dici di impostare Android: weightSum del genitore: impostalo su un valore o semplicemente inseriscilo, come dovrebbe essere impostato?
theJerm

1
@batbrat è corretto, stavo generando l'interfaccia utente in modo dinamico. A volte tratto i frammenti XML come modelli e poi li modifico o popolo in fase di esecuzione. Questo trucco non ha funzionato per me in questo caso, ho dovuto reimpostare la larghezza e il peso espliciti per farlo funzionare.
Picchio muratore

52

Lo è android:layout_weight. Il peso può essere utilizzato solo in LinearLayout. Se l'orientamento di linearlayout è Verticale, utilizzare android:layout_height="0dp"e se l'orientamento è orizzontale, quindi utilizzare android:layout_width = "0dp". Funzionerà perfettamente.



16

Prova a impostare layout_widthentrambi i pulsanti su "0dip" e weightentrambi su0.5


Ora entrambi i pulsanti scompaiono dallo schermo
Janusz,

ok, quindi imposta la larghezza del layout sia su fill_parent che sui pesi su 0,5
jqpubliq

dai un'occhiata a questo e questo . Sono un po 'confuso sul perché questo non funziona ancora, ma forse questo ti darà delle idee.
jqpubliq,

7

LinearLayout supporta l'assegnazione di un peso a singoli bambini. Questo attributo assegna un valore di " importanza " a una vista e gli consente di espandersi per riempire lo spazio rimanente nella vista padre. Il peso predefinito è zero

calcolo per assegnare qualsiasi spazio rimanente / extra tra i bambini. (non lo spazio totale)

spazio assegnato a child = (peso individuale del bambino) / (somma del peso di ogni bambino nel layout lineare)

Esempio (1): se ci sono tre caselle di testo e due dichiarano un peso di 1, mentre alla terza non viene dato peso (0), lo spazio rimanente / aggiuntivo viene assegnato a

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

Esempio (2) : supponiamo di avere un'etichetta di testo e due elementi di modifica del testo in una riga orizzontale. L'etichetta non ha layout_weight specificato, quindi occupa lo spazio minimo richiesto per il rendering. Se layout_weight di ciascuno dei due elementi di modifica del testo è impostato su 1, la larghezza rimanente nel layout principale verrà suddivisa equamente tra di loro (poiché riteniamo che siano ugualmente importanti).

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

Se la prima casella di testo ha un layout_weight di 1 e la seconda casella di testo ha un layout_weight di 2, allora un terzo dello spazio rimanente verrà assegnato al primo e due terzi al secondo (perché sosteniamo che il secondo è più importante).

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

7

Nel campo della larghezza del pulsante, sostituire wrap-contentcon 0dp.
Usa l'attributo layout_weight di una vista.

android:layout_width="0dp"  

Ecco come apparirà il tuo codice:

<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 viene utilizzato per distribuire lo spazio rimasto in proporzioni. In questo caso, i due pulsanti stanno assumendo la larghezza "0dp". Quindi, lo spazio rimanente sarà diviso in proporzione 1: 1 tra loro, cioè lo spazio sarà diviso equamente tra le viste dei pulsanti.


6

Mi piace la risposta di @Manoj Seelan

Sostituisci android:layout_weightcon android:weight.

Quando usi Weight con LinearLayout. è necessario aggiungere weightSumin LinearLayoute secondo l'orientamento del vostro LinearLayoutè necessario impostare 0dpper la larghezza / altezza a tutti LinearLayout`s vista dei bambini

Esempio :

Se L'orientamento di Linearlayoutè Vertical, quindi Imposta larghezza di tutte le LinearLayoutviste Bambini con0dp

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

Se l'orientamento Linearlayoutdi è horizontal, quindi imposta l'altezza di tutte le LinearLayoutviste "Bambini" con 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

Forse l'impostazione di entrambe le proprietà layout_width dei pulsanti su "fill_parent" farà il trucco.

Ho appena testato questo codice e funziona nell'emulatore:

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

Assicurati di impostare layout_width su "fill_parent" su entrambi i pulsanti.


1
questo spinge solo il pulsante destro fuori dallo schermo e mostra solo il primo pulsante.
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>

Ora preferirei suggerisco di usare layout_weight = "50" e layout_width = "0px"
Yar

2

Nel XML sopra, imposta il android:layout_weightlayout lineare come 2: android:layout_weight="2"


3
Perché è necessario? Perché il peso del layout di 2 è importante? Perché non 20 o 200?
Conrad Frix,

2

Inoltre, è necessario aggiungerlo android:layout_width="0dp"per le visualizzazioni dei bambini [Visualizzazioni pulsanti] diLinerLayout


2

Devi scrivere in questo modo, funziona per me

<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

Di seguito sono riportate le modifiche (contrassegnate in grassetto ) nel codice:

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

Dal momento che LinearLayout ha l'orientamento come orizzontale, quindi dovrai mantenere la larghezza solo come 0dp. per l'utilizzo di pesi in quella direzione. (Se il tuo orientamento fosse verticale, avresti mantenuto la tua altezza solo 0dp) .

Poiché ci sono 2 viste e le hai posizionate android:layout_weight="1"per entrambe le viste, significa che dividerà le due viste equamente in direzione orizzontale (o per larghezza).


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

Questa è la risposta perfetta al tuo problema

  <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
Quindi è "peso" o "layout_weight" ??
IgorGanapolsky,

È Android: layout_weight
Mahendra Gunawardena il


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>

inserisci qui la descrizione dell'immagine

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.