Risposte:
Con layout_weight
è possibile specificare un rapporto di dimensioni tra più viste. Ad esempio hai un MapView
e un table
che 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_weight
di map
a 3 e il layout_weight
di table
a 1.
Per farlo funzionare devi anche impostare l'altezza o la larghezza (a seconda dell'orientamento) su 0px.
In breve, layout_weight
specifica 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.
In generale, la formula è:
spazio assegnato al bambino = (peso individuale del bambino) / (somma del peso di ogni bambino nel layout lineare)
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)
Supponiamo di avere un'etichetta di testo e due elementi di modifica del testo in una riga orizzontale. L'etichetta non è stata layout_weight
specificata, quindi occupa lo spazio minimo richiesto per il rendering. Se uno 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).
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_weight
1 e la seconda casella di testo ha un layout_weight
2, 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)
android:layout_width="0px"
è importante. Inoltre, i pesi non devono necessariamente essere numeri interi.
weightSum
viene allora l'immagine? Ha qualcosa a che fare con layout_weight
?
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
Se ci sono più viste che abbracciano a LinearLayout
, quindi layout_weight
assegna a ciascuna di esse una dimensione proporzionale. Una vista con un layout_weight
valore maggiore "pesa" di più, quindi ottiene uno spazio maggiore.
Ecco un'immagine per rendere le cose più chiare.
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.
È lo stesso per il peso del layout. Il Views
piano orizzontale LinearLayout
possono ciascuna assumere una certa percentuale della larghezza totale. (O una percentuale dell'altezza per una verticale LinearLayout
.)
Quello LinearLayout
che 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_weight
non funziona per le visualizzazioni in RelativeLayouts (vedere qui e qui per le risposte SO relative a questo problema).
Ogni vista in orizzontale ha un LinearLayout
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"
. 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 Button
Nell'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_weight
possono essere dannosi per le prestazioni.
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>
layout_weight
dice ad Android come distribuire i tuoi messaggi View
in a LinearLayout
. Android quindi prima calcola la proporzione totale richiesta per tutti gli View
s che hanno un peso specificato e li posiziona in View
base alla frazione dello schermo che ha specificato di cui ha bisogno. Nel seguente esempio, Android vede che TextView
s ha un layout_weight
di 0
(questo è il valore predefinito) e EditText
s ha un layout_weight
di 2
ciascuno, mentre Button
ha un peso di 1
. Quindi Android alloca lo spazio "appena sufficiente" per la visualizzazione tvUsername
e tvPassword
quindi divide il resto della larghezza dello schermo in 5 parti uguali, due delle quali sono allocate etUsername
, due in etPassword
e 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:
e
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,
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).
http://developer.android.com/guide/topics/ui/layout-objects.html#linearlayout
layout_weight definisce lo spazio che il controllo deve ottenere rispettivamente rispetto ad altri controlli.
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>
Combinando entrambe le risposte di
Flo & rptwsthi e roetzi,
Ricorda di cambiare il tuo layout_width=0dp/px
, altrimenti il layout_weight
comportamento 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.
L'aggiunta android:autoSizeTextType="uniform"
ridimensionerà il testo automaticamente
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
.