android-layout app - Cosa significa android:layout_weight?




widget ui (12)

Pensalo in questo modo, sarà più semplice

Se hai 3 pulsanti e il loro peso è 1,3,1, funzionerà come una tabella in HTML

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

Considerare,

Non capisco come usare questo attributo. Qualcuno può dirmi di più a riguardo?


layout_weight dice ad Android come distribuire i tuoi View in LinearLayout . Android calcola dapprima la proporzione totale richiesta per tutte le View che hanno un peso specificato e posiziona ciascuna View base alla frazione dello schermo che ha specificato di cui ha bisogno. Nel seguente esempio, Android vede che i TextView hanno un layout_weight di layout_weight di 0 (questo è l'impostazione predefinita) e gli EditText hanno un layout_weight di layout_weight di 2 ciascuno, mentre il Button ha un peso di 1 . Quindi Android assegna lo spazio "appena sufficiente" per visualizzare tvUsername e tvPassword e quindi divide il resto della larghezza dello schermo in 5 parti uguali, due delle quali sono assegnate a etUsername , due a etPassword e l'ultima parte a 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:
e



una delle migliori spiegazioni per me era questa (dal tutorial di Android, cercare 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 la quantità di spazio sullo schermo che devono essere visualizzate. L'assegnazione di un valore superiore a zero dividerà il resto dello spazio disponibile nella Vista genitore, in base al valore del peso_piatto di ogni vista e al rapporto complessivo_peso specificato nel layout corrente per questo e altri elementi di visualizzazione.

Per fare un esempio: diciamo che abbiamo 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 peso di layout di ciascuno dei due elementi di modifica del testo è impostato su 1, la larghezza rimanente nel layout principale verrà divisa in parti uguali tra loro (perché dichiariamo che sono ugualmente importanti). Se il primo ha un peso di layout di 1 e il secondo ha un peso di layout di 2, allora un terzo dello spazio rimanente sarà dato al primo e due terzi al secondo (perché rivendichiamo che il secondo è più importante).


In poche parole, layout_weight specifica la quantità di spazio aggiuntivo nel layout da assegnare alla vista.

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

Calcolo per assegnare qualsiasi spazio rimanente tra i bambini

In generale, la formula è:

spazio assegnato a child = (peso individuale del bambino) / (somma di peso di ogni bambino in Linear Layout)

Esempio 1

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

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

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

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

Esempio 2

Diciamo che abbiamo 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 layout_weight di ciascuno dei due elementi di modifica del testo è impostato su 1, la larghezza rimanente nel layout principale verrà divisa in parti uguali tra loro (perché dichiariamo che sono ugualmente importanti).

Calcolo:

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

2 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_weight di layout_weight di 1, e la seconda casella di testo ha un layout_weight di layout_weight di 2, quindi un terzo dello spazio rimanente verrà assegnato al primo e due terzi al secondo (perché rivendichiamo il secondo è più importante).

Calcolo:

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

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

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

Articolo di origine


Combinando entrambe le risposte di

Flo & rptwsthi e roetzi,

Ricordati di cambiare layout_width=0dp/px , altrimenti il ​​comportamento di layout_weight agirà inverso con il numero più grande occupato nello spazio più piccolo e il numero più basso occupato lo spazio più grande.

Inoltre, alcune combinazioni di pesi causeranno la mancata visualizzazione di un layout (poiché occupa più spazio).

Attenzione a questo.


Aggiunta di android:autoSizeTextType="uniform" ridimensionerà automaticamente il testo


Si prega di guardare il peso di LinearLayout e il peso di layout di ciascuna vista. android: weightSum = "4" android: layout_weight = "2" android: layout_weight = "2" Loro layout_height sono entrambi 0px, ma non sono sicuro che sia rilevante

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

Per ulteriori :

Per vertical orientamento vertical , non dimenticare di impostare l' height su 0 dpi

android:layout_height="0dp"

Per l'orientamento horizontal , non dimenticare la width impostata su 0dp

android:layout_width="0dp"

Come suggerisce il nome, il peso del layout specifica quale quantità o percentuale di spazio occuperà lo spazio dello schermo su un determinato campo o widget.
Se specificiamo il peso in orientamento orizzontale, allora dobbiamo specificare layout_width = 0px .
Allo stesso modo, se specifichiamo il peso in orientamento verticale, allora dobbiamo specificare layout_height = 0px .


Se ci sono più viste che attraversano un LinearLayout , quindi layout_weight fornisce a ciascuna una dimensione proporzionale. Una vista con un valore di layout_weight più grande "pesa" di più, quindi ottiene uno spazio maggiore.

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

Teoria

Il termine peso del layout è correlato al concetto di media ponderata in matematica. È come in una classe di un college dove i compiti valgono il 30%, la frequenza è del 10%, il midterm vale il 20% e la finale vale il 40%. I tuoi punteggi per quelle parti, se ponderati, ti danno il voto totale.

È lo stesso per il peso del layout. Le Views in un LinearLayout orizzontale possono occupare ciascuna una determinata percentuale della larghezza totale. (O una percentuale dell'altezza per un LinearLayout verticale).

Lo schema

Il LinearLayout che usi sarà simile a questo:

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

    <!-- list of subviews -->

</LinearLayout>

Nota che devi usare layout_width="match_parent" per LinearLayout . Se usi wrap_content , non funzionerà. Si noti inoltre che layout_weight non funziona per le viste in RelativeLayouts (vedere here e here per le risposte SO che trattano questo problema).

Le visualizzazioni

Ogni vista in un LinearLayout orizzontale ha un aspetto 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" . Dimenticarlo causa molti nuovi problemi agli utenti. (Vedi questo articolo per i diversi risultati che puoi ottenere non impostando la larghezza su 0.) Se le tue viste sono in un LinearLayout verticale, LinearLayout usare layout_height="0dp" , ovviamente.

Nell'esempio di Button sopra ho impostato il peso su 1, ma puoi usare qualsiasi numero. È solo il totale che conta. Puoi vedere nelle tre file di pulsanti nella prima immagine che ho postato, i numeri sono tutti diversi, ma poiché le proporzioni sono le stesse, le larghezze ponderate non cambiano in ogni riga. Ad alcune persone piace usare numeri decimali con una somma di 1 in modo che in un layout complesso sia chiaro qual è il peso di ciascuna parte.

Un'ultima nota. Se disponi di molti layout nidificati che utilizzano layout_weight , può essere negativo 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>

Il contesto è fondamentalmente per l'accesso alle risorse e ottenere i dettagli dell'ambiente dell'applicazione (per il contesto dell'applicazione) o dell'attività (per il contesto di attività) o qualsiasi altro ...

Per evitare perdite di memoria, dovresti utilizzare il contesto dell'applicazione per ogni componente che necessita di un oggetto di contesto .... per ulteriori informazioni clicca here





android android-layout android-widget