Que signifie Android: layout_weight?

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

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

Pour que cela fonctionne, vous devez également définir la hauteur ou la largeur (selon votre orientation) sur 0px.

En bref, layout_weight spécifie la quantité d’espace supplémentaire dans la présentation à allouer à la vue.

LinearLayout prend en charge l’atsortingbution d’un poids à chaque enfant. Cet atsortingbut atsortingbue une valeur “d’importance” à une vue et lui permet de se développer pour remplir tout espace restant dans la vue parent. Le poids par défaut des vues est zéro.

Calcul pour affecter tout espace restant entre l’enfant

En général, la formule est la suivante:

espace atsortingbué à l’enfant = (poids individuel de l’enfant) / (sum du poids de chaque enfant en disposition linéaire)

Exemple 1

S’il y a trois zones de texte et que deux d’entre elles déclarent un poids de 1, tandis que la troisième ne reçoit aucun poids (0), l’espace restant est affecté 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 ligne horizontale. L’étiquette n’a pas de layout_weight spécifié, de sorte qu’il prend l’espace minimum requirejs pour le rendu. Si le layout_weight de chacun des deux éléments d’édition de texte est défini sur 1, la largeur restante dans la mise en page parent sera divisée de manière égale entre eux (car nous affirmons qu’ils sont également importants).

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 un layout_weight de mise en layout_weight de 1 et si la deuxième zone de texte a un layout_weight de mise en layout_weight de 2, un tiers de l’espace restant sera atsortingbué au premier et deux tiers au second ( 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

en ajoutant aux 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 ordures

S’il existe plusieurs vues couvrant un LinearLayout , alors layout_weight leur donne chacune une taille proportionnelle. Une vue avec une valeur de layout_weight plus layout_weight “pèse” plus, donc elle prend plus de place.

Voici une image pour rendre les choses plus claires.

entrer la description de l'image ici

Théorie

Le poids de mise en page est lié au concept de moyenne pondérée en mathématiques. C’est comme dans une classe de collège où les devoirs valent 30%, l’assiduité 10%, le moyen terme 20% et la finale 40%. Vos notes pour ces parties, lorsqu’elles sont pondérées ensemble, vous donnent votre note totale.

entrer la description de l'image ici

C’est la même chose pour le poids de la mise en page. Les Views dans un LinearLayout horizontal peuvent chacune prendre un certain pourcentage de la largeur totale. (Ou un pourcentage de la hauteur pour un LinearLayout vertical.)

La disposition

Le LinearLayout que vous utilisez ressemblera à ceci:

    

Notez que vous devez utiliser layout_width="match_parent" pour LinearLayout . Si vous utilisez wrap_content , cela ne fonctionnera pas. Notez également que layout_weight ne fonctionne pas pour les vues dans RelativeLayouts (voir ici et ici pour les réponses SO traitant de ce problème).

Les vues

Chaque vue dans un LinearLayout horizontal ressemble à ceci:

  

Notez que vous devez utiliser layout_width="0dp" avec layout_weight="1" . Oublier cela provoque beaucoup de nouveaux problèmes d’utilisateurs. (Voir cet article pour les différents résultats que vous pouvez obtenir en ne définissant pas la largeur à 0.) Si vos vues sont dans un LinearLayout vertical, vous utiliserez bien layout_height="0dp" .

Dans l’exemple de Button ci-dessus, je règle le poids à 1, mais vous pouvez utiliser n’importe quel nombre. Ce n’est que le total qui compte. Vous pouvez voir dans les trois rangées de boutons de la première image que j’ai posté, les nombres sont tous différents, mais comme les proportions sont les mêmes, les largeurs pondérées ne changent pas dans chaque ligne. Certaines personnes aiment utiliser des nombres décimaux dont la sum est égale à 1, de sorte que, dans une mise en page complexe, le poids de chaque pièce est clair.

Une dernière note Si vous avez beaucoup de mises en page nestedes qui utilisent layout_weight , cela peut layout_weight aux performances.

Supplémentaire

Voici l’agencement xml de l’image du haut:

 < ?xml version="1.0" encoding="utf-8"?>                     

layout_weight indique à Android comment dissortingbuer vos View s dans un LinearLayout . Android calcule ensuite la proportion totale requirejse pour toutes les View ayant un poids spécifié et place chaque View fonction de la fraction de l’écran spécifiée. Dans l’exemple suivant, Android voit que les TextView ont un layout_weight de 0 (c’est le EditText par défaut) et que les EditText ont un layout_weight de 2 chacun, tandis que le Button a un poids de 1 . Ainsi, Android alloue un espace juste suffisant pour afficher tvUsername et tvPassword , puis divise le rest de la largeur de l’écran en 5 parties égales, dont deux sont atsortingbuées à etUsername , deux à etPassword et la dernière à bLogin :

        

Ça ressemble à:
orientation paysage et
orientation portrait

Pensez comme ça, ce sera plus simple

Si vous avez 3 boutons et que leur poids est 1,3,1 en conséquence, cela fonctionnera comme une table en HTML

Fournir 5 portions pour cette ligne: 1 portion pour le bouton 1, 3 portions pour le bouton 2 et 1 portion pour le bouton 1

Ce qui concerne,

l’une des meilleures explications pour moi était celle-ci (à partir du tutoriel Android, regardez l’étape 7) :

Le paramètre layout_weight est utilisé dans LinearLayouts pour atsortingbuer une “importance” aux vues dans la présentation. Toutes les vues ont un layout_weight par défaut de zéro, ce qui signifie qu’elles occupent seulement autant de place à l’écran que nécessaire. L’affectation d’une valeur supérieure à zéro permet de fractionner le rest de l’espace disponible dans la vue parente, en fonction de la valeur de layout_weight de chaque View et de son ratio par rapport à la disposition actuelle de cet élément et d’autres éléments View.

Pour donner un exemple: disons que nous avons une étiquette de texte et deux éléments d’édition de texte dans une ligne horizontale. L’étiquette n’a pas de layout_weight spécifié, de sorte qu’il prend l’espace minimum requirejs pour le rendu. Si le layout_weight de chacun des deux éléments d’édition de texte est défini sur 1, la largeur restante dans la mise en page parent sera divisée de manière égale entre eux (car nous affirmons qu’ils sont également importants). Si le premier a un poids de 1 et que le second a un poids de mise en page de 2, alors un tiers de l’espace restant sera donné au premier, et les deux tiers au second (car le second est plus important).

http://developer.android.com/guide/topics/ui/layout-objects.html#linearlayout

layout_weight définit combien d’espace le contrôle doit obtenir respectivement pour les autres contrôles.

Veuillez regarder le weightSum de LinearLayout et le layout_weight de chaque vue. android: weightSum = “4” android: layout_weight = “2” android: layout_weight = “2” Leur layout_height est à la fois 0px, mais je ne suis pas sûr

 < ?xml version="1.0" encoding="utf-8"?>     

Pour plus :

Pour vertical orientation vertical , n’oubliez pas de régler la height à 0dp

 android:layout_height="0dp" 

Pour horizontal orientation horizontal , n’oubliez pas de définir la width à 0dp

 android:layout_width="0dp" 

Combinant les deux réponses de

Flo & Rptwsthi et Roetzi,

N’oubliez pas de changer votre layout_width=0dp/px , sinon le comportement layout_weight agira en sens inverse, le plus grand nombre occupant le plus petit espace et le plus petit nombre occupant le plus grand espace.

En outre, certaines combinaisons de poids entraîneront la non présentation de certaines dispositions (car elles occupent l’espace).

Attention à cela.

Ajouter android:autoSizeTextType="uniform" redimensionnera automatiquement le texte pour vous

Comme son nom l’indique, le poids de la mise en page spécifie la quantité ou le pourcentage d’espace qu’un champ ou un widget particulier doit occuper dans l’espace de l’écran.
Si nous spécifions le poids en orientation horizontale, nous devons spécifier layout_width = 0px .
De même, si nous spécifions le poids en orientation verticale, nous devons spécifier layout_height = 0px .