Je veux savoir: Qu'est-ce qu'Android: weightSum et poids du layout, et comment fonctionnent-ils?
Réponses
Trop de publicités?Ajoutant à superM et Jeff réponse,
Si il y a 2 points de vue dans le LinearLayout, la première avec un layout_weight de 1, la seconde avec un layout_weight de 2 et pas de weightSum est spécifié, par défaut, le weightSum est calculée à 3 (somme des poids de l'enfant) et le premier point de vue prend 1/3 de l'espace, tandis que le second prend 2/3.
Cependant, si nous étions à spécifier le weightSum que 5, le premier prendrait 1/5ème de l'espace, tandis que la seconde serait de prendre 2/5ème. Donc un total de 3/5e de l'espace occupé par la mise en page en conservant le reste vide.
Il vaut mieux expliquer avec un exemple. Vous avez un LinearLayout
d'orientation horizontale et vous avez trois ImageViews
intérieur et vous voulez que ces ImageViews
prennent toujours un espace égal. Vous pouvez définir le layout_weight
de chaque ImageView
à 1 et le weightSum
en LinearLayout
à 3 pour y parvenir. L'avantage, c'est que cela fonctionnera correctement pour tous les périphériques, ce qui ne se produira pas si vous définissez directement la largeur et la hauteur.
La documentation en parle et comprend un exemple, (mise en valeur de la mine).
android:weightSum
Définit le poids maximum de la somme. Si non spécifié, la somme est calculée par l'ajout de la layout_weight de tous les enfants. Ceci peut être utilisé pour exemple pour donner un seul enfant 50% de l'espace total disponible par en lui donnant un layout_weight de 0,5 et de réglage de la weightSum à 1.0.
Afin de corriger superM exemple, supposons que vous avez un LinearLayout
avec une orientation horizontale qui contient deux ImageViews
et TextView
avec. Vous définissez l' TextView
ont une taille fixe, et que vous aimeriez les deux ImageViews
de prendre le reste de l'espace aussi.
Pour ce faire, vous appliquez layout_weight
1 à chaque ImageView
, aucun sur l' TextView
, et un weightSum
de 2.0 sur l' LinearLayout
.
Après quelques tests, je pense que l'algorithme de LinearLayout est ceci:
Supposons que weightSum
est réglé à une valeur. Le cas de l'absence est discuté plus tard.
Tout d'abord, diviser l' weightSum
par le nombre d'éléments d' match_parent
ou fill_parent
dans la dimension de la LinearLayout (par exemple, layout_width
pour orientation="horizontal"
). Nous appelons cette valeur, le poids multiplicateur pour chaque élément. La valeur par défaut de weightSum
est 1.0, de sorte que le poids par défaut de multiplicateur 1/n
où n
est le nombre d' fill_parent
éléments; wrap_content
éléments ne contribuent pas à l' n
.
E. g. lors de l' weightSum
est de 60, et il y a 3 fill_parent
éléments, le poids multiplicateur est de 20. Le poids multiplicateur est la valeur par défaut pour, par exemple, layout_width
si l'attribut est absent.
Deuxièmement, le maximum d'extension de chaque élément est calculée. Tout d'abord, l' wrap_content
des éléments sont calculées en fonction de leur contenu. Leur expansion est déduit de l'extension du conteneur parent. Nous l'appellerons le reste a été expansion_remainer
. Ce reliquat est réparti entre fill_parent
- éléments, en fonction de leur layout_weight
.
Troisièmement, l'expansion de chaque fill_parent
élément est calculé comme:
Exemple:
Si weightSum
est de 60, et il y a 3 fill_parent
éléments avec la weigths 10, 20 et 30, leur expansion sur l'écran est de 2/3, 1/3 et 0/3 du conteneur parent.
weight | expansion
0 | 3/3
10 | 2/3
20 | 1/3
30 | 0/3
40 | 0/3
Le minimum d'expansion est limitée à 0. L'extension maximale est limitée à la taille du parent, c'est à dire les poids sont plafonnés à 0.
Si un élément est défini à l' wrap_content
, son expansion est calculé d'abord, et le reste de l'expansion est soumis à la répartition entre l' fill_parent
- éléments. Si weightSum
est définie, ce qui conduit à l' layout_weight
n'ayant aucun effet sur wrap_content
- éléments.
Toutefois, wrap_content
éléments peuvent encore être poussé hors de la zone visible par des éléments dont le poids est inférieur (par exemple entre 0 et 1 pour weightSum
= 1 ou entre 0-20 pour l'exemple ci-dessus).
Si aucun weightSum
est spécifié, il est calculé comme la somme des layout_weight
valeurs, y compris les éléments avec de l' wrap_content
ensemble! Donc, avoir layout_weight
ensemble sur wrap_content
éléments peuvent influencer leur expansion. E. g. un poids négatif diminuera les autres fill_parent
- éléments.
Avant l' fill_parent
des éléments sont disposés, la formule ci-dessus sera appliquée à l' wrap_content
éléments, avec un maximum possible de l'expansion de leur expansion en fonction de la enveloppé de contenu. L' wrap_content
éléments sera rétrécie, et par la suite le maximum possible d'expansion pour le restant fill_parent
éléments est calculé et diffusé.
Cela peut conduire à des résultats non intuitifs.
Si non spécifié, la somme est calculée en ajoutant la layout_weight de tous les enfants. Ceci peut être utilisé par exemple pour donner un seul enfant 50 % de l’espace disponible total en lui donnant un layout_weight de 0,5 et affectant le weightSum 1.0. Doit être flottante point de valeur, tels que « 1.2 »