Je ne comprends pas comment utiliser cet attribut. Quelqu'un peut-il m'en dire plus?
650
Je ne comprends pas comment utiliser cet attribut. 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 devraient 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 réglerez le layout_weight
du map
à 3 et le layout_weight
du table
à 1.
Pour le faire fonctionner, 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 mise en page à allouer à la vue.LinearLayout prend en charge l'attribution d'un poids à chaque enfant. Cet attribut attribue 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 attribuer tout espace restant entre l'enfant
En général, la formule est:
Exemple 1
S'il y a trois zones de texte et que deux d'entre elles déclarent un poids de 1, alors que la troisième n'a pas de poids (0), l'espace restant est affecté comme suit:
Exemple 2
Disons que nous avons une étiquette de texte et deux éléments d'édition de texte sur une ligne horizontale. L'étiquette n'a pas de
layout_weight
spécification, elle occupe donc l'espace minimum requis pour le rendu. Si lelayout_weight
de chacun des deux éléments d'édition de texte est défini sur 1, la largeur restante dans la disposition parent sera divisée également entre eux (car nous prétendons qu'ils sont également importants).Calcul:
Si, au lieu de cela, la première zone de texte a un
layout_weight
de 1 et la deuxième zone de texte a unlayout_weight
de 2, alors un tiers de l'espace restant sera donné au premier et deux tiers au second (car nous revendiquons le second l'un est plus important).Calcul:
Article d'origine
la source
android:layout_width="0px"
est important. De plus, les poids n'ont pas besoin d'être des entiers.weightSum
vient l'image alors? Est-ce que cela a quelque chose à voirlayout_weight
?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 mise en page à 0px
sinon vous verrez des ordures
la source
S'il y a plusieurs vues couvrant un
LinearLayout
,layout_weight
leur donne à chacune une taille proportionnelle. Une vue avec une plus grandelayout_weight
valeur "pèse" plus, donc elle obtient un plus grand espace.Voici une image pour rendre les choses plus claires.
Théorie
Le terme poids de mise en page est lié au concept de moyenne pondérée en mathématiques. C'est comme dans une classe universitaire où les devoirs valent 30%, la fréquentation vaut 10%, le milieu de la journée vaut 20% et la finale vaut 40%. Vos scores pour ces parties, lorsqu'ils sont pondérés ensemble, vous donnent votre note totale.
Il en va de même pour le poids de la mise en page. L'
Views
horizontaleLinearLayout
peut occuper chacune un certain pourcentage de la largeur totale. (Ou un pourcentage de la hauteur pour une verticaleLinearLayout
.)La disposition
Le
LinearLayout
que vous utilisez ressemblera à ceci:Notez que vous devez utiliser
layout_width="match_parent"
pour leLinearLayout
. Si vous utilisezwrap_content
, cela ne fonctionnera pas. Notez également quelayout_weight
cela 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 une horizontale
LinearLayout
ressemble à ceci:Notez que vous devez utiliser
layout_width="0dp"
aveclayout_weight="1"
. Oublier cela provoque de nombreux problèmes de nouveaux utilisateurs. (Voir cet article pour différents résultats que vous pouvez obtenir en ne définissant pas la largeur à 0.) Si vos vues sont verticales,LinearLayout
vous les utiliserezlayout_height="0dp"
bien sûr.Dans l'
Button
exemple ci-dessus, j'ai défini le poids sur 1, mais vous pouvez utiliser n'importe quel nombre. Seul le total compte. Vous pouvez voir dans les trois rangées de boutons de la première image que j'ai publiée, les nombres sont tous différents, mais comme les proportions sont les mêmes, les largeurs pondérées ne changent pas dans chaque rangée. Certaines personnes aiment utiliser des nombres décimaux qui ont une somme de 1 afin que dans une mise en page complexe, il soit clair quel est le poids de chaque pièce.Une dernière note. Si vous disposez de nombreuses dispositions imbriquées
layout_weight
, cela peut nuire aux performances.Supplémentaire
Voici la disposition xml de l'image du haut:
la source
layout_weight
indique à Android comment distribuer vosView
s dans un fichierLinearLayout
. Android calcule ensuite d'abord la proportion totale requise pour tous lesView
s qui ont un poids spécifié et les place chacun enView
fonction de la fraction de l'écran dont il a spécifié qu'il a besoin. Dans l'exemple suivant, Android voit que lesTextView
s ont unlayout_weight
de0
(c'est la valeur par défaut) et lesEditText
s ont unlayout_weight
de2
chacun, tandis que leButton
a un poids de1
. Android alloue donc `` juste assez '' d'espace pour affichertvUsername
,tvPassword
puis divise 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
:Il ressemble à:
et
la source
Pensez-y de cette façon, sera plus simple
Si vous avez 3 boutons et leurs poids sont 1,3,1 en conséquence, cela fonctionnera comme un tableau en HTML
Fournissez 5 portions pour cette ligne: 1 portion pour le bouton 1, 3 portions pour le bouton 2 et 1 portion pour le bouton 1
Qui concerne,
la source
l'une des meilleures explications pour moi était celle-ci (à partir du tutoriel Android, recherchez l'étape 7) :
la source
http://developer.android.com/guide/topics/ui/layout-objects.html#linearlayout
layout_weight définit la quantité d'espace que le contrôle doit obtenir respectivement pour les autres contrôles.
la source
Pour plus :
Pour l'
vertical
orientation, n'oubliez pas de réglerheight
sur 0dpPour l'
horizontal
orientation, n'oubliez pas de réglerwidth
sur 0dpla source
Veuillez regarder le weightSum de LinearLayout et le layout_weight de chaque vue. android: weightSum = "4" android: layout_weight = "2" android: layout_weight = "2" Leurs layout_height sont tous les deux 0px, mais je ne suis pas sûr que ce soit pertinent
la source
Combiner les deux réponses de
Flo & rptwsthi et roetzi,
N'oubliez pas de changer votre
layout_width=0dp/px
, sinon lelayout_weight
comportement agira à l'envers, le plus grand nombre occupant le plus petit espace et le plus petit nombre occupant le plus grand espace.De plus, certaines combinaisons de poids entraîneront une certaine mise en page qui ne peut pas être affichée (car elle occupait trop l'espace).
Méfiez-vous de cela.
la source
L'ajout
android:autoSizeTextType="uniform"
redimensionnera automatiquement le texte pour vousla source
Comme son nom l'indique, la pondération de mise en page spécifie la quantité ou le pourcentage d'espace qu'un champ ou un widget particulier doit occuper l'espace d'écran.
Si nous spécifions le poids en orientation horizontale, alors nous devons spécifier
layout_width = 0px
.De même, si nous spécifions le poids en orientation verticale, alors nous devons le spécifier
layout_height = 0px
.la source