Je veux savoir: Qu'est-ce que Android: weightSum et layout weight, et comment fonctionnent-ils?
la source
Je veux savoir: Qu'est-ce que Android: weightSum et layout weight, et comment fonctionnent-ils?
Par documentation, android:weightSum
définit la somme de poids maximum et est calculée comme la somme layout_weight
de tous les enfants si elle n'est pas spécifiée explicitement.
Prenons un exemple avec une LinearLayout
orientation horizontale et 3 à l' ImageViews
intérieur. Maintenant, nous voulons que ceux-ci ImageViews
prennent toujours la même place. Pour y parvenir, vous pouvez définir le layout_weight
de chacun ImageView
sur 1 et le weightSum
sera calculé pour être égal à 3 comme indiqué dans le commentaire.
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
<!-- android:weightSum="3" -->
android:orientation="horizontal"
android:layout_gravity="center">
<ImageView
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_width="0dp"/>
.....
weightSum
est utile pour rendre la mise en page correctement pour n'importe quel appareil, ce qui ne se produira pas si vous définissez directement la largeur et la hauteur.
weightSum
. Le comportement de votre exemple serait identique àweightSum
omis et, en fait, weightSum ne doit pas être spécifié dans ce scénario. La documentation dit,weightSum Defines the maximum weight sum. If unspecified, the sum is computed by adding the layout_weight of all of the children.
En plus de la réponse de superM et de Jeff,
S'il y a 2 vues dans LinearLayout, la première avec un layout_weight de 1, la seconde avec un layout_weight de 2 et aucun weightSum n'est spécifié, par défaut, le weightSum est calculé à 3 (somme des poids des enfants) et la première vue occupe 1/3 de l'espace tandis que la seconde prend 2/3.
Cependant, si nous devions spécifier le weightSum comme 5, le premier prendrait 1 / 5ème de l'espace tandis que le second prendrait 2 / 5ème. Ainsi, un total de 3 / 5ème de l'espace serait occupé par la mise en page gardant le reste vide.
la source
La somme des poids fonctionne exactement comme vous le souhaitez (comme pour les autres réponses, vous n'avez pas à additionner tous les poids sur la mise en page parent). Sur la vue enfant, spécifiez le poids que vous voulez qu'il prenne. N'oubliez pas de préciser
Voici un exemple
Cela ressemblera à
la source
La documentation le dit le mieux et comprend un exemple (mettant en évidence le mien).
Donc, pour corriger l'exemple de superM, supposons que vous ayez un
LinearLayout
avec une orientation horizontale qui contient deuxImageViews
et unTextView
avec. Vous définissez leTextView
pour avoir une taille fixe et vous souhaitez que les deuxImageViews
occupent également l'espace restant.Pour ce faire, appliquez
layout_weight
1 à chacunImageView
, aucun sur leTextView
et unweightSum
de 2,0 sur leLinearLayout
.la source
Après quelques expérimentations, je pense que l'algorithme de LinearLayout est le suivant:
Supposons qu'il
weightSum
soit défini sur une valeur. Le cas d'absence est discuté plus loin.Commencez par diviser le
weightSum
par le nombre d'éléments avecmatch_parent
oufill_parent
dans la dimension du LinearLayout (par exemplelayout_width
pourorientation="horizontal"
). Nous appellerons cette valeur le multiplicateur de poids pour chaque élément. La valeur par défaut deweightSum
est 1.0, donc le multiplicateur de poids par défaut est1/n
, oùn
est le nombre d'fill_parent
éléments;wrap_content
éléments ne contribuent pas àn
.Par exemple, quand
weightSum
vaut 60 et qu'il y a 3fill_parent
éléments, le multiplicateur de poids est 20. Le multiplicateur de poids est la valeur par défaut pour, par exemple,layout_width
si l'attribut est absent.Deuxièmement, l'expansion maximale possible de chaque élément est calculée. Tout d'abord, les
wrap_content
éléments sont calculés en fonction de leur contenu. Leur expansion est déduite de l'expansion du conteneur parent. Nous appellerons le resteexpansion_remainer
. Ce reste est réparti entre lesfill_parent
éléments selon leurlayout_weight
.Troisièmement, l'expansion de chaque
fill_parent
élément est calculée comme suit:Exemple:
Si
weightSum
vaut 60, et qu'il y a 3fill_parent
éléments de poids 10, 20 et 30, leur expansion sur l'écran est de 2/3, 1/3 et 0/3 du conteneur parent.L'expansion minimale est plafonnée à 0. L'expansion maximale est plafonnée à la taille du parent, c'est-à-dire que les poids sont plafonnés à 0.
Si un élément est défini sur
wrap_content
, son expansion est calculée en premier et l'expansion restante est sujette à une distribution entre lesfill_parent
éléments. SiweightSum
est défini, cela conduit àlayout_weight
n'avoir aucun effet sur leswrap_content
éléments. Cependant, leswrap_content
éléments peuvent encore être poussés hors de la zone visible par des éléments dont le poids est inférieur à (par exemple entre 0-1 pourweightSum
= 1 ou entre 0-20 pour l'exemple ci-dessus).Si non
weightSum
est spécifié, il est calculé comme la somme de toutes leslayout_weight
valeurs, y compris les éléments avecwrap_content
set! Donc, avoirlayout_weight
mis sur deswrap_content
éléments, peut influencer leur expansion. Par exemple, un poids négatif réduira les autresfill_parent
éléments. Avant que lesfill_parent
éléments ne soient disposés, la formule ci-dessus sera appliquée auxwrap_content
éléments, l'expansion maximale possible étant leur expansion en fonction du contenu emballé. Leswrap_content
éléments seront réduits, et ensuite l'expansion maximale possible pour lesfill_parent
éléments restants est calculée et distribuée.Cela peut conduire à des résultats peu intuitifs.
la source
S'il n'est pas spécifié, la somme est calculée en ajoutant le layout_weight de tous les enfants. Ceci peut être utilisé par exemple pour donner à un seul enfant 50% de l'espace total disponible en lui donnant un layout_weight de 0,5 et en définissant le weightSum sur 1.0. Doit être une valeur à virgule flottante, telle que "1,2"
la source
Une chose qui semble que personne d'autre n'a mentionné: disons que vous avez une verticale
LinearLayout
, donc pour que les poids dans la mise en page / l'élément / la vue à l'intérieur fonctionnent à 100% correctement - ils doivent tous avoir unelayout_height
propriété (qui doit exister dans votre xml file) défini sur0dp
. Il semble que toute autre valeur gâcherait les choses dans certains cas.la source
Le poids de la mise en page fonctionne comme un rapport. Par exemple, s'il existe une disposition verticale et qu'il y a deux éléments (tels que des boutons ou des vues de texte), l'un ayant un poids de mise en page 2 et l'autre un poids de mise en page 3 respectivement. Ensuite, le premier élément occupera 2 parties sur 5 de l'écran / mise en page et l'autre 3 sur 5 parties. Ici, 5 est la somme des poids. c'est-à-dire que la somme de poids divise la mise en page entière en portions définies. Et le poids de mise en page définit la portion occupée par l'élément particulier par rapport à la somme de poids totale prédéfinie. La somme des poids peut également être déclarée manuellement. Les boutons, les vues de texte, les edittexts, etc. sont tous organisés à l'aide de la pondération et du poids de la mise en page lors de l'utilisation de mises en page linéaires pour la conception de l'interface utilisateur.
la source
De la documentation du développeur
Cela peut être utilisé par exemple pour donner à un seul enfant
50%
de l'espace total disponible en lui donnant un layout_weight de0.5
et en définissant le weightSum sur1.0
.Ajout à la réponse @Shubhayu
rest
3/5
peut être utilisé pour d'autres mises en page enfants qui n'ont vraiment pas besoin d'une partie spécifique de la mise en page contenant.il s'agit d'une utilisation potentielle de la
android:weightSum
propriété.la source