Cosa significa android: layout_weight?


Risposte:


860

Con layout_weightè possibile specificare un rapporto di dimensioni tra più viste. Ad esempio hai un MapViewe un tableche dovrebbe mostrare alcune informazioni aggiuntive sulla mappa. La mappa dovrebbe usare 3/4 dello schermo e la tabella dovrebbe usare 1/4 dello schermo. Quindi imposterai il layout_weightdi mapa 3 e il layout_weightdi tablea 1.

Per farlo funzionare devi anche impostare l'altezza o la larghezza (a seconda dell'orientamento) su 0px.


208
grattacapo fino a quando non hai citato l'altezza 0px!
Johnny Rambada,

24
Per definire quale di essi sarà influenzato dal peso. Larghezza o altezza
Neteinstein,

30
È necessario lo 0px. Esempio: si desidera implementare una tabella con due colonne di dimensioni uguali. Ogni riga di tabella è un layout lineare orizzontale con due "celle di tabella" (ad esempio TextViews), ognuna con layout_weight = .5. Se si specifica layout_width = "wrap_content" nelle "celle della tabella", la larghezza del contenuto verrà aggiunta alla larghezza calcolata da layout_weight, le celle della tabella avranno dimensioni diverse e le colonne non si allineeranno correttamente. Quindi devi impostare layout_width = 0dp in modo che Android usi solo layout_weight per calcolare la larghezza delle celle.
eeeeaaii,

3
@Solace, risposta tardiva, ma per completezza .. Sembra che l'attributo del peso non stia contribuendo a RelativeLayout. Funziona solo con LinearLayout. Se vedi la necessità di peso, forse la strada da percorrere è creare un LinearLayout (con pesi) all'interno di RelativeLayout.
bbv,

1
layout_weight funziona solo per il layout lineare o funziona per ogni gruppo di viste.
meShakti,

247

In breve, layout_weightspecifica la quantità di spazio extra nel layout da allocare alla vista.

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 di Views è zero.

Calcolo per assegnare lo spazio rimanente tra i bambini

In generale, la formula è:

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

Esempio 1

Se ci sono tre caselle di testo e due di esse dichiarano un peso di 1, mentre alla terza non viene dato peso (0), lo spazio rimanente viene assegnato come segue:

1a casella di testo = 1 / (1 + 1 + 0)

2a casella di testo = 1 / (1 + 1 + 0)

3a casella di testo = 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 è stata layout_weightspecificata, quindi occupa lo spazio minimo richiesto per il rendering. Se uno layout_weightdi 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).

Calcolo:

1a etichetta = 0 / (0 + 1 + 1)

2a casella di testo = 1 / (0 + 1 + 1)

3a casella di testo = 1 / (0 + 1 + 1)

Se, invece, la prima casella di testo ha un layout_weight1 e la seconda casella di testo ha un layout_weight2, allora un terzo dello spazio rimanente verrà assegnato al primo e due terzi al secondo (perché rivendichiamo il secondo uno è più importante).

Calcolo:

1a etichetta = 0 / (0 + 1 + 2)

2a casella di testo = 1 / (0 + 1 + 2)

3a casella di testo = 2 / (0 + 1 + 2)


Articolo di origine


19
Una spiegazione molto migliore della risposta attualmente selezionata.
Ombra

12
Bene, c'è la semplice spiegazione (che apprezzo) e i dettagli nitidi e grintosi (che apprezzo in modo diverso). Sono entrambe buone risposte.
cbmanica,

3
Come menzionato altrove, android:layout_width="0px"è importante. Inoltre, i pesi non devono necessariamente essere numeri interi.
Brian White,

Questo è un po 'più difficile da capire rispetto alla risposta selezionata, ma fornisce la risposta completa, in particolare quando alcune viste hanno pesi e altre no. Questo è un enorme caso d'uso non coperto dalla risposta selezionata.
Acey,

da dove weightSumviene allora l'immagine? Ha qualcosa a che fare con layout_weight?
eRaisedToX

72

aggiungendo alle altre risposte, la cosa più importante per farlo funzionare è impostare la larghezza (o l'altezza) del layout su 0px

android:layout_width="0px"

altrimenti vedrai immondizia


Penso che dipenda se si desidera nascondere le viste che non definiscono i loro pesi o se si desidera mostrarle con dimensioni da adattare e lasciare lo spazio libero rimanente alle viste "ponderate".
Andrea Leganza,

Cosa succede se devo impostare sia il peso orizzontale che quello verticale?
Alston,

40

Se ci sono più viste che abbracciano a LinearLayout, quindi layout_weightassegna a ciascuna di esse una dimensione proporzionale. Una vista con un layout_weightvalore maggiore "pesa" di più, quindi ottiene uno spazio maggiore.

Ecco un'immagine per rendere le cose più chiare.

inserisci qui la descrizione dell'immagine

Teoria

Il termine peso di layout è correlato al concetto di media ponderata in matematica. È come in una classe universitaria in cui i compiti a casa valgono il 30%, la frequenza vale il 10%, l'intervallo vale il 20% e la finale vale il 40%. I tuoi punteggi per quelle parti, se ponderati insieme, ti danno il voto totale.

inserisci qui la descrizione dell'immagine

È lo stesso per il peso del layout. Il Viewspiano orizzontale LinearLayoutpossono ciascuna assumere una certa percentuale della larghezza totale. (O una percentuale dell'altezza per una verticale LinearLayout.)

Lo schema

Quello LinearLayoutche userai sarà simile a questo:

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

    <!-- list of subviews -->

</LinearLayout>

Si noti che è necessario utilizzare layout_width="match_parent"per il LinearLayout. Se lo usi wrap_content, non funzionerà. Si noti inoltre che layout_weightnon funziona per le visualizzazioni in RelativeLayouts (vedere qui e qui per le risposte SO relative a questo problema).

Le visualizzazioni

Ogni vista in orizzontale ha un LinearLayoutaspetto simile al seguente:

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

Si noti che è necessario utilizzare layout_width="0dp"insieme a layout_weight="1". Dimenticare questo causa molti problemi ai nuovi utenti. (Vedi questo articolo per diversi risultati che puoi ottenere non impostando la larghezza su 0.) Se le tue viste sono in verticale, LinearLayout allora useresti layout_height="0dp", ovviamente.

Nel ButtonNell'esempio precedente ho impostato il peso di 1, ma è possibile utilizzare qualsiasi numero. È solo il totale che conta. Puoi vedere nelle tre file di pulsanti nella prima immagine che ho pubblicato, i numeri sono tutti diversi, ma poiché le proporzioni sono uguali, le larghezze ponderate non cambiano in ogni riga. Ad alcune persone piace usare numeri decimali che hanno una somma di 1 in modo che in un layout complesso sia chiaro quale sia il peso di ciascuna parte.

Un'ultima nota. Se si utilizzano molti layout nidificati che layout_weightpossono essere dannosi per le prestazioni.

Extra

Ecco il layout XML per l'immagine in alto:

<?xml version="1.0" encoding="utf-8"?>
<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:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="android:layout_weight="
        android:textSize="24sp" />

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

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

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

    </LinearLayout>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="android:layout_weight="
        android:textSize="24sp" />

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

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

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

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

    </LinearLayout>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="android:layout_weight="
        android:textSize="24sp" />

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

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".25"
            android:text=".25" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".50"
            android:text=".50" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".25"
            android:text=".25" />

    </LinearLayout>

</LinearLayout>

1
Mi chiedo sempre perché più persone non pubblicano immagini per accompagnare il loro XML. È molto più facile capire la grafica che il codice.
AleksandrH,

30

layout_weightdice ad Android come distribuire i tuoi messaggi Viewin a LinearLayout. Android quindi prima calcola la proporzione totale richiesta per tutti gli Views che hanno un peso specificato e li posiziona in Viewbase alla frazione dello schermo che ha specificato di cui ha bisogno. Nel seguente esempio, Android vede che TextViews ha un layout_weightdi 0(questo è il valore predefinito) e EditTexts ha un layout_weightdi 2ciascuno, mentre Buttonha un peso di 1. Quindi Android alloca lo spazio "appena sufficiente" per la visualizzazione tvUsernamee tvPasswordquindi divide il resto della larghezza dello schermo in 5 parti uguali, due delle quali sono allocate etUsername, due in etPassworde l'ultima parte in bLogin:

<LinearLayout android:orientation="horizontal" ...>

    <TextView android:id="@+id/tvUsername" 
    android:text="Username" 
    android:layout_width="wrap_content" ... />

    <EditText android:id="@+id/etUsername"
    android:layout_width="0dp"
    android:layout_weight="2" ... />

    <TextView android:id="@+id/tvPassword"
    android:text="Password"
    android:layout_width="wrap_content" />

    <EditText android:id="@+id/etPassword"
    android:layout_width="0dp"
    android:layout_weight="2" ... />

    <Button android:id="@+id/bLogin"
    android:layout_width="0dp"
    android:layout_weight="1"
    android:text="Login"... />

</LinearLayout>

Sembra:
orientamento orizzontale e
Orientamento verticale


il link non è più disponibile. Se hai un'altra buona referenza, ti preghiamo di aggiornare.
Binary

16

Pensala in questo modo, sarà più semplice

Se hai 3 pulsanti e i loro pesi sono di conseguenza 1,3,1, funzionerà come una tabella in HTML

Fornire 5 porzioni per quella linea: 1 porzione per il pulsante 1, 3 parti per il pulsante 2 e 1 porzione per il pulsante 1

Considerare,


10

una delle migliori spiegazioni per me è stata questa (dal tutorial di Android, cerca il passaggio 7) :

layout_weight viene utilizzato in LinearLayouts per assegnare "importanza" alle viste all'interno del layout. Tutte le viste hanno un layout_weight predefinito pari a zero, il che significa che occupano solo lo spazio sullo schermo di cui devono essere visualizzate. L'assegnazione di un valore maggiore di zero suddividerà il resto dello spazio disponibile nella vista principale, in base al valore di layout_weight di ciascuna vista e al suo rapporto con il layout_weight complessivo specificato nel layout corrente per questo e altri elementi della vista.

Per fare un esempio: 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 il 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). Se il primo ha un layout_weight di 1 e il secondo 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).



4

Per ulteriori

Per l' verticalorientamento, non dimenticare di impostare heightsu 0dp

android:layout_height="0dp"

Per l' horizontalorientamento, non dimenticare di impostare widthsu 0dp

android:layout_width="0dp"

3

Si prega di guardare il peso di LinearLayout e il layout_weight di ogni vista. android: weightSum = "4" android: layout_weight = "2" android: layout_weight = "2" Il loro layout_height sono entrambi 0px, ma non sono sicuro che sia pertinente

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:weightSum="4">

<fragment android:name="com.example.SettingFragment"
    android:id="@+id/settingFragment"
    android:layout_width="match_parent"
    android:layout_height="0px"
    android:layout_weight="2"
    />

<Button
    android:id="@+id/dummy_button"
    android:layout_width="match_parent"
    android:layout_height="0px"
    android:layout_weight="2"
    android:text="DUMMY"
    />
</LinearLayout>

Si prega di guardare il peso di LinearLayout e il layout_weight di ogni vista. android: weightSum = "4" android: layout_weight = "2" android: layout_weight = "2" Il loro layout_height sono entrambi 0px, ma non sono sicuro che sia rilevante.
Ming Leung,

0

Combinando entrambe le risposte di

Flo & rptwsthi e roetzi,

Ricorda di cambiare il tuo layout_width=0dp/px, altrimenti il layout_weightcomportamento agirà in modo inverso con il numero più grande occupato lo spazio più piccolo e il numero più basso occupato lo spazio più grande.

Inoltre, alcune combinazioni di pesi causeranno l'impossibilità di visualizzare alcuni layout (poiché occupano troppo spazio).

Attenzione a questo.


0

L'aggiunta android:autoSizeTextType="uniform"ridimensionerà il testo automaticamente


-1

Come suggerisce il nome, Peso del layout specifica la quantità o la percentuale di spazio che un determinato campo o widget deve occupare lo spazio dello schermo.
Se si specifica il peso in orientamento orizzontale, è necessario specificare layout_width = 0px.
Allo stesso modo, se si specifica il peso in orientamento verticale, è necessario specificare layout_height = 0px.

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.