168 votes

Quel est android: weightSum dans android, et comment ça marche?

Je veux savoir: Qu'est-ce qu'Android: weightSum et poids du layout, et comment fonctionnent-ils?

179voto

Shubhayu Points 5072

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.

136voto

superM Points 2985

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.

25voto

Jeff Axelrod Points 8946

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.

20voto

Jens Jensen Points 235

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 w_m 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/nn est le nombre d' fill_parent éléments; wrap_content éléments ne contribuent pas à l' n.

w_m = weightSum / #fill_parent

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:

w_m - ( layout_weight / w_m ) * maximum_possible_expansion

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 weight multiplier (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.

10voto

Faakhir Points 346

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 »

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