674 votes

Que signifie Android:layout_weight ?

Je ne comprends pas comment utiliser cet attribut. Quelqu'un peut-il m'en dire plus ?

889voto

Flo Points 13170

Avec layout_weight vous pouvez spécifier un rapport de taille entre plusieurs vues. Par exemple, vous avez une MapView et un table qui devrait afficher des informations supplémentaires sur la carte. La carte doit utiliser les 3/4 de l'écran et le tableau doit utiliser 1/4 de l'écran. Ensuite, vous définirez le layout_weight de la map à 3 et le layout_weight de la table à 1.

Pour que cela fonctionne, vous devez également régler la hauteur ou la largeur (en fonction de votre orientation) sur 0px.

214 votes

Jusqu'à ce que vous mentionniez la hauteur de 0px !

25 votes

Définir lesquels d'entre eux seront affectés par le poids. La largeur ou la hauteur.

30 votes

Vous avez besoin du 0px. Exemple : vous voulez mettre en place un tableau avec deux colonnes de taille égale. Chaque ligne du tableau est une mise en page linéaire horizontale avec deux "cellules de tableau" (par exemple, des TextViews), chacune ayant layout_weight=.5. Si vous spécifiez layout_width="wrap_content" sur les "cellules de tableau", la largeur du contenu sera ajoutée à la largeur calculée par layout_weight, les cellules de tableau auront toutes des tailles différentes et les colonnes ne seront pas alignées correctement. Vous devez donc définir layout_width=0dp pour qu'Android utilise uniquement layout_weight pour calculer la largeur des cellules.

257voto

ArK Points 5284

En un mot, layout_weight spécifie la part de l'espace supplémentaire de la mise en page à allouer à la vue.

LinearLayout permet d'attribuer un poids aux enfants individuels. Cet attribut attribue une valeur d'"importance" à une vue, et lui permet de s'étendre pour remplir tout espace restant dans la vue parent. Le poids par défaut des vues est de zéro.

Calcul pour attribuer tout espace restant entre les enfants

En général, la formule est :

espace attribué à l'enfant = (poids individuel de l'enfant) / (somme des poids de tous les enfants de Linear Layout)

Exemple 1

S'il y a trois zones de texte et que deux d'entre elles ont un poids de 1, tandis que la troisième n'a aucun poids (0), l'espace restant est attribué comme suit :

1ère zone de texte = 1/(1+1+0)

2ème zone de texte = 1/(1+1+0)

3ème zone de texte = 0/(1+1+0)

Exemple 2

Disons que nous avons une étiquette de texte et deux éléments d'édition de texte dans une rangée horizontale. L'étiquette n'a pas de layout_weight spécifié, afin qu'il occupe le minimum d'espace nécessaire au rendu. Si le layout_weight de chacun des deux éléments d'édition de texte est fixé à 1, la largeur restante dans la mise en page parente sera répartie de manière égale entre eux (car nous affirmons qu'ils sont d'importance égale).

Calcul :

1ère étiquette = 0/(0+1+1)

2ème zone de texte = 1/(0+1+1)

3ème zone de texte = 1/(0+1+1)

Si, au lieu de cela, la première zone de texte a une valeur de layout_weight de 1, et la deuxième zone de texte a une valeur de layout_weight de 2, alors un tiers de l'espace restant sera donné au premier, et deux tiers au second (parce que nous prétendons que le second est plus important).

Calcul :

1ère étiquette = 0/(0+1+2)

2ème zone de texte = 1/(0+1+2)

3ème zone de texte = 2/(0+1+2)


Article source

20 votes

Une bien meilleure explication que la réponse actuellement sélectionnée.

13 votes

Il y a l'explication simple (que j'apprécie) et les détails minutieux (que j'apprécie d'une manière différente). Ce sont toutes deux de bonnes réponses.

4 votes

Comme mentionné ailleurs, android:layout_width="0px" est important. De plus, les poids n'ont pas besoin d'être des entiers.

74voto

roetzi Points 524

En plus des autres réponses, la chose la plus importante pour que cela fonctionne est de définir la largeur (ou la hauteur) de la mise en page à 0px.

android:layout_width="0px"

sinon vous verrez des déchets

0 votes

Je pense que cela dépend si vous voulez cacher les vues qui ne définissent pas leur poids ou si vous voulez les afficher avec une taille adaptée et laisser l'espace libre restant aux vues "pondérées".

30voto

Tash Pemhiwa Points 2800

layout_weight indique à Android comment distribuer votre View dans un LinearLayout . Android calcule alors d'abord la proportion totale nécessaire pour tous les View qui ont un poids spécifié et place chaque View en fonction de la fraction de l'écran dont il a spécifié avoir besoin. Dans l'exemple suivant, Android voit que l'écran TextView ont un layout_weight de 0 (c'est la valeur par défaut) et le EditText ont un layout_weight de 2 chacun, tandis que les Button a un poids de 1 . Android alloue donc "juste assez" d'espace pour afficher tvUsername y tvPassword et divise ensuite le reste de la largeur de l'écran en 5 parties égales, dont deux sont attribuées à etUsername , deux à etPassword et la dernière partie à 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>

On dirait :
landscape orientation et
portrait orientation

16voto

George Nguyen Points 1025

Pensez-y de cette façon, ce sera plus simple

Si vous avez 3 boutons et que leur poids est de 1,3,1, cela fonctionnera comme un tableau en HTML.

Prévoir 5 portions pour cette ligne : 1 portion pour le bouton 1, 3 portions pour le bouton 2 et 1 portion pour le bouton 1

Regardez,

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X