Avec layout_weight vous pouvez spécifier un rapport de taille entre plusieurs points de vue. E. g. vous avez un MapView et un table qui devrait afficher des informations supplémentaires à la carte. La carte doit utiliser les 3/4 de l'écran et le tableau doit utiliser 1/4 de l'écran. Ensuite, vous devez définir la layout_weight de la map à 3 et la layout_weight de la table à 1.
Pour le faire fonctionner vous devez également définir la hauteur ou la largeur (en fonction de votre orientation) à 0px.
gratte la tête jusqu'à ce que vous avez mentionné le 0px hauteur!
Pourquoi devrions-nous définir la hauteur ou la largeur de 0dp pour le faire fonctionner?
Pour définir qui sera affectée par le poids. La largeur ou la hauteur.
Vous avez besoin de la 0px. Exemple: vous souhaitez mettre en place une table avec deux de même taille des colonnes. Chaque ligne de la table est horizontale linéaire de la mise en page avec deux "cellules d'un tableau" (par exemple, TextViews), chacun ayant layout_weight=.5. Si vous spécifiez layout_width="wrap_content" sur les "cellules d'un tableau," le contenu de la largeur sera ajoutée à la largeur calculée par layout_weight, les cellules de la table seront tous de tailles différentes, et les colonnes ne s'alignent pas correctement. Donc, vous avez à mettre layout_width=0dp de sorte qu'android utilise uniquement layout_weight pour calculer la largeur des cellules.
Que faire si le parent est un RelativeLayout, il agit sur la largeur ou la hauteur, dont l'un doit être mis à 0px?
Vous n'avez pas besoin de la 0px chez un enfant de LinearLayout parce que le android:orientation attribut spécifie la question de savoir si les éléments sont disposés verticalement ou horizontalement.
0px sur la hauteur ou la largeur (en utilisant layout_weight) ne fonctionne pas pour les boutons. Il les fait disparaître.
réponse tardive, mais par souci d'exhaustivité .. Semble, comme le poids de l'attribut n'est pas de contribuer à RelativeLayout. Il fonctionne uniquement avec le LinearLayout. Si vous voyez un besoin de poids, peut-être le chemin à parcourir est de créer un LinearLayout (avec weightages) dans RelativeLayout.
Aussi ..Peut-être Pour les débutants....Si la Disposition a plusieurs enfants ,alors n'oubliez pas de donner layout_weight à chaque vue.
Quelque chose comme le flex de la propriété en CSS flexbox ?
J'ai utilisé ce à l'intérieur d'une horizontale RadioGroup avec deux RadioButtons à l'intérieur d'un RelativeLayout. Le premier wieght à 1 et le deuxième à 3 m'a donné une belle marge entre la première et la deuxième.
si vous incluez le layout_weight attribut ensuite, le système doit calculer la largeur (ou la hauteur) un deuxième temps, à l'aide de la valeur de poids pour allouer de l'espace. C'est deux fois plus de travail. C'est pourquoi vous devez définir la largeur ou la hauteur de la valeur de l'attribut 0dp donc il n'y a pas de supplément de calcul. Le système utilise ensuite le poids de l'attribut de faire le calcul.
ne layout_weight de travail uniquement pour les linéaires de mise en page ou de travail pour chaque groupe affichage.
La même explication vaut pour GridLayout - si vous voulez étirer dans les deux directions à la fois d'eux a besoin de la 0dp!
l'ajout de android:autoSizeTextType="uniform" redimensionner le texte automatiquement pour vous
Que faire si j'ai besoin d'ajuster à la fois la largeur et la hauteur? Le layout_weight seule influence d'un facteur?
En un mot, layout_weight spécifie comment une grande partie de l'espace supplémentaire dans la disposition à être alloués à la Vue.
LinearLayout prend en charge l'attribution d'un poids à chaque enfant. Cet attribut attribue une "importance" de la valeur à vue, et permet de l'étendre à remplir tout l'espace restant dans la vue parent. Vues de " poids par défaut est zéro.
Calcul pour attribuer tout l'espace restant entre l'enfant
En général, la formule est:
de l'espace attribué à l'enfant = enfant (du poids) /(somme des poids de chaque enfant dans les Linéaires de Mise en page)
Exemple 1
S'il y a trois zones de texte et deux d'entre eux déclarent un poids de 1, tandis que le troisième n'est pas de poids (0), alors 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 un texte d'étiquette et le texte de deux de modifier des éléments dans une rangée horizontale. L'étiquette n'a pas de layout_weight spécifié, alors il prend un minimum d'espace requis pour le rendu. Si le layout_weight de chacun des deux d'édition de texte, des éléments est définie sur 1, la largeur restante dans le parent de la mise en page sera divisé en parts égales entre eux (parce que nous affirment qu'ils sont tout aussi importants).
Calcul:
1er label = 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 1, et la deuxième zone de texte a un layout_weight de 2, puis le tiers du reste de l'espace sera donnée à la première, et les deux tiers pour le second (car nous prétendons que la seconde est plus important).
Une bien meilleure explication que celle actuellement sélectionnée réponse.
Eh bien, il y a l'explication simple (que j'apprécie) et le nitty gritty détails (que j'apprécie d'une manière différente). Ils sont tous les deux bonnes réponses.
Comme mentionné ailleurs, android:layout_width="0px" est important. Aussi, le poids n'avez pas besoin d'être des entiers.
C'est un peu plus difficile à comprendre que la réponse choisie, mais il donne la réponse complète - en particulier lorsque certains points de vue ont un poids, et certains ne le font pas. C'est un énorme cas d'utilisation ne sont pas couverts par la réponse choisie.
d'où vient weightSum viennent à l'image alors? A-t-elle quelque chose à voir avec layout_weight?
de les ajouter aux autres réponses, la chose la plus importante pour obtenir ce travail est de définir la mise en page de la largeur (ou hauteur) à 0px
android:layout_width="0px"
sinon, vous verrez les ordures
Je pense que cela dépend si vous souhaitez masquer les points de vue qui ne définissent pas leur poids ou que vous voulez leur montrer la taille-pour-ajustement de la taille et de laisser l'espace libre restant à la "pondéré" points de vue.
Que faire si j'ai besoin de configurer à la fois horizontale et verticale du poids?
S'il y a plusieurs points de vue s'étendant sur une LinearLayout, puis layout_weight leur donne à chacun une taille proportionnelle. Une vue avec un plus grand layout_weight valeur "pèse" plus de, de sorte qu'il devient un espace plus grand.
Voici une image pour rendre les choses plus claires.
Théorie
Le terme de mise en page de poids est liée à la notion de moyenne pondérée en mathématiques. C'est comme dans un cours à l'université, où les devoirs sont d'une valeur de 30%, la fréquentation est d'une valeur de 10%, à la mi-parcours est une valeur de 20%, et le final vaut la peine 40%. Vos scores pour les parties, pondéré ensemble, vous donner à votre total de la note.
C'est la même chose pour la mise en page de poids. Le Views à l'horizontale LinearLayout chacun peut prendre jusqu'à un certain pourcentage de la largeur totale. (Ou un pourcentage de la hauteur pour une verticale LinearLayout.)
La Mise En Page
La LinearLayout que vous utilisez va ressembler à quelque chose comme ceci:
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><!-- list of subviews --></LinearLayout>
Notez que vous devez utiliser layout_width="match_parent" pour la LinearLayout. Si vous utilisez wrap_content, alors il ne fonctionnera pas. Notez également que layout_weight ne fonctionne pas pour les vues en RelativeLayouts (voir ici et ici pour tant de réponses traitant de ce sujet).
Le Point De Vue
Chaque point de vue à l'horizontale LinearLayout ressemble à quelque chose comme ceci:
Notez que vous devez utiliser layout_width="0dp" avec layout_weight="1". Oublier cela provoque beaucoup de nouveaux problèmes aux utilisateurs. (Voir cet article pour les différents résultats que vous pouvez obtenir en ne définissant pas la largeur à 0.) Si votre point de vue dans un verticaleLinearLayout alors vous devez utiliser layout_height="0dp", bien sûr.
Dans le Button exemple ci-dessus j'ai mis le poids à 1, mais vous pouvez utiliser n'importe quel nombre. C'est seulement le total qui compte. Vous pouvez le voir dans les trois rangées de boutons dans la première image que j'ai posté, les chiffres sont tous différents, mais depuis que les proportions sont les mêmes, le prix des largeurs de ne pas changer à chaque ligne. Certaines personnes aiment à utiliser des nombres décimaux qui ont une somme de 1, de sorte que dans un plan complexe, il est clair que le poids de chaque partie est.
Une note finale. Si vous avez beaucoup d'imbrication des présentations qui utilisent layout_weight, il peut être mauvais pour la performance.
Supplémentaire
Voici le xml de mise en page pour l'image du haut:
Je me demande toujours pourquoi plus de gens ne pas poster des images pour accompagner leur XML. Il est beaucoup plus facile de comprendre les visuels que le code.
layout_weight raconte Android comment distribuer votre Views dans un LinearLayout. Android puis calcule d'abord la proportion totale requise pour tous les Views qui ont un poids spécifié et place chaque View selon quelle fraction de l'écran, il a précisé qu'il a besoin. Dans l'exemple suivant, Android voit que le TextViews ont un layout_weight de 0 (c'est la valeur par défaut) et le EditTexts ont un layout_weight de 2 chacun, alors que le Button a un poids de 1. Donc Android alloue le "juste assez" de l'espace pour afficher tvUsername et tvPassword et puis divise le reste de la largeur de l'écran en 5 parties égales, dont deux sont attribués à etUsername, deux à etPassword et la dernière partie à bLogin:
layout_weight est utilisé dans LinearLayouts affecter "l'importance" de Vues au sein de la structure. Tous les points de Vue ont une valeur par défaut layout_weight de zéro, ce qui signifie qu'ils prennent autant de place sur l'écran comme ils doivent être affichés. L'attribution d'une valeur supérieure à zéro va diviser le reste de l'espace disponible dans la Vue parent, en fonction de la valeur de chaque Vue layout_weight, et son rapport à l'ensemble de la layout_weight spécifié dans le courant de la mise en page et d'autres éléments.
Pour donner un exemple: disons que nous avons un texte d'étiquette et le texte de deux de modifier des éléments dans une rangée horizontale. L'étiquette n'a pas de layout_weight spécifié, alors il prend un minimum d'espace requis pour le rendu. Si le layout_weight de chacun des deux d'édition de texte, des éléments est définie sur 1, la largeur restante dans le parent de la mise en page sera divisé en parts égales entre eux (parce que nous affirment qu'ils sont tout aussi importants). Si la première a une layout_weight de 1 et le second a une layout_weight de 2, puis le tiers du reste de l'espace sera donnée à la première, et les deux tiers pour le second (car nous prétendons que la seconde est plus important).
Veuillez jeter un oeil à la weightSum de LinearLayout et la layout_weight de chaque Vue. android:weightSum="4" android:layout_weight="2" android:layout_weight="2" Leurs layout_height sont à la fois 0px, mais je ne suis pas sûr que c'est relevan
Merci de regarder la weightSum de LinearLayout et la layout_weight de chaque Vue. android:weightSum="4" android:layout_weight="2" android:layout_weight="2" Leurs layout_height sont à la fois 0px, mais je ne suis pas sûr qu'il soit pertinent.
N'oubliez pas de changer votre layout_width=0dp/px, sinon le layout_weight comportement de loi à l'inverse avec le plus grand nombre occupé l'espace le plus petit et le plus faible nombre occupé le plus grand espace.
En outre, certains des poids de combinaison causé une certaine mise en page ne peuvent pas être affichés (depuis le temps occupé l'espace).
Comme son nom l'indique, la Mise en page de poids indique quel est le montant ou le pourcentage de l'espace un champ ou d'un widget devrait occuper l'espace de l'écran.
Si l'on précise poids à l'horizontale, alors nous devons spécifier layout_width = 0px.
De même, Si l'on précise poids dans l'orientation verticale, alors nous devons spécifier layout_height = 0px.
Avec
layout_weight
vous pouvez spécifier un rapport de taille entre plusieurs points de vue. E. g. vous avez unMapView
et untable
qui devrait afficher des informations supplémentaires à la carte. La carte doit utiliser les 3/4 de l'écran et le tableau doit utiliser 1/4 de l'écran. Ensuite, vous devez définir lalayout_weight
de lamap
à 3 et lalayout_weight
de latable
à 1.Pour le faire fonctionner vous devez également définir la hauteur ou la largeur (en fonction de votre orientation) à 0px.
RelativeLayout
, il agit sur la largeur ou la hauteur, dont l'un doit être mis à0px
?0px
chez un enfant deLinearLayout
parce que leandroid:orientation
attribut spécifie la question de savoir si les éléments sont disposés verticalement ou horizontalement.layout_weight
) ne fonctionne pas pour les boutons. Il les fait disparaître.RadioGroup
avec deuxRadioButton
s à l'intérieur d'unRelativeLayout
. Le premier wieght à 1 et le deuxième à 3 m'a donné une belle marge entre la première et la deuxième.android:autoSizeTextType="uniform"
redimensionner le texte automatiquement pour vouslayout_weight
seule influence d'un facteur?En un mot,
layout_weight
spécifie comment une grande partie de l'espace supplémentaire dans la disposition à être alloués à la Vue.LinearLayout prend en charge l'attribution d'un poids à chaque enfant. Cet attribut attribue une "importance" de la valeur à vue, et permet de l'étendre à remplir tout l'espace restant dans la vue parent. Vues de " poids par défaut est zéro.
Calcul pour attribuer tout l'espace restant entre l'enfant
En général, la formule est:
Exemple 1
S'il y a trois zones de texte et deux d'entre eux déclarent un poids de 1, tandis que le troisième n'est pas de poids (0), alors l'espace restant est affecté comme suit:
Exemple 2
Disons que nous avons un texte d'étiquette et le texte de deux de modifier des éléments dans une rangée horizontale. L'étiquette n'a pas de
layout_weight
spécifié, alors il prend un minimum d'espace requis pour le rendu. Si lelayout_weight
de chacun des deux d'édition de texte, des éléments est définie sur 1, la largeur restante dans le parent de la mise en page sera divisé en parts égales entre eux (parce que nous affirment qu'ils sont tout aussi 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, puis le tiers du reste de l'espace sera donnée à la première, et les deux tiers pour le second (car nous prétendons que la seconde est plus important).Calcul:
Source de l'article
android:layout_width="0px"
est important. Aussi, le poids n'avez pas besoin d'être des entiers.weightSum
viennent à l'image alors? A-t-elle quelque chose à voir aveclayout_weight
?de les ajouter aux autres réponses, la chose la plus importante pour obtenir ce travail est de définir la mise en page de la largeur (ou hauteur) à 0px
sinon, vous verrez les ordures
S'il y a plusieurs points de vue s'étendant sur une
LinearLayout
, puislayout_weight
leur donne à chacun une taille proportionnelle. Une vue avec un plus grandlayout_weight
valeur "pèse" plus de, de sorte qu'il devient un espace plus grand.Voici une image pour rendre les choses plus claires.
Théorie
Le terme de mise en page de poids est liée à la notion de moyenne pondérée en mathématiques. C'est comme dans un cours à l'université, où les devoirs sont d'une valeur de 30%, la fréquentation est d'une valeur de 10%, à la mi-parcours est une valeur de 20%, et le final vaut la peine 40%. Vos scores pour les parties, pondéré ensemble, vous donner à votre total de la note.
C'est la même chose pour la mise en page de poids. Le
Views
à l'horizontaleLinearLayout
chacun peut prendre jusqu'à un certain pourcentage de la largeur totale. (Ou un pourcentage de la hauteur pour une verticaleLinearLayout
.)La Mise En Page
La
LinearLayout
que vous utilisez va ressembler à quelque chose comme ceci:Notez que vous devez utiliser
layout_width="match_parent"
pour laLinearLayout
. Si vous utilisezwrap_content
, alors il ne fonctionnera pas. Notez également quelayout_weight
ne fonctionne pas pour les vues en RelativeLayouts (voir ici et ici pour tant de réponses traitant de ce sujet).Le Point De Vue
Chaque point de vue à l'horizontale
LinearLayout
ressemble à quelque chose comme ceci:Notez que vous devez utiliser
layout_width="0dp"
aveclayout_weight="1"
. Oublier cela provoque beaucoup de nouveaux problèmes aux utilisateurs. (Voir cet article pour les différents résultats que vous pouvez obtenir en ne définissant pas la largeur à 0.) Si votre point de vue dans un verticaleLinearLayout
alors vous devez utiliserlayout_height="0dp"
, bien sûr.Dans le
Button
exemple ci-dessus j'ai mis le poids à 1, mais vous pouvez utiliser n'importe quel nombre. C'est seulement le total qui compte. Vous pouvez le voir dans les trois rangées de boutons dans la première image que j'ai posté, les chiffres sont tous différents, mais depuis que les proportions sont les mêmes, le prix des largeurs de ne pas changer à chaque ligne. Certaines personnes aiment à utiliser des nombres décimaux qui ont une somme de 1, de sorte que dans un plan complexe, il est clair que le poids de chaque partie est.Une note finale. Si vous avez beaucoup d'imbrication des présentations qui utilisent
layout_weight
, il peut être mauvais pour la performance.Supplémentaire
Voici le xml de mise en page pour l'image du haut:
layout_weight
raconte Android comment distribuer votreView
s dans unLinearLayout
. Android puis calcule d'abord la proportion totale requise pour tous lesView
s qui ont un poids spécifié et place chaqueView
selon quelle fraction de l'écran, il a précisé qu'il a besoin. Dans l'exemple suivant, Android voit que leTextView
s ont unlayout_weight
de0
(c'est la valeur par défaut) et leEditText
s ont unlayout_weight
de2
chacun, alors que leButton
a un poids de1
. Donc Android alloue le "juste assez" de l'espace pour affichertvUsername
ettvPassword
et puis divise le reste de la largeur de l'écran en 5 parties égales, dont deux sont attribués àetUsername
, deux àetPassword
et la dernière partie àbLogin
:Il ressemble à:
Penser à elle de cette façon, sera plus simple
Si vous avez 3 boutons et leur poids sont 1,3,1 en conséquence, il fonctionnera comme le tableau en HTML
Fournir des 5 portions pour cette ligne: 1 partie pour le bouton 1, 3 partie pour le bouton 2 et 1 partie pour le bouton 1
Égard,
l'une des meilleures explications pour moi a été celui-ci (à partir de l'Android tutoriel, cherchez l'étape 7):
http://developer.android.com/guide/topics/ui/layout-objects.html#linearlayout
layout_weight définit de combien d'espace le contrôle doit obtenir respectivement à d'autres contrôles.
Veuillez jeter un oeil à la weightSum de LinearLayout et la layout_weight de chaque Vue. android:weightSum="4" android:layout_weight="2" android:layout_weight="2" Leurs layout_height sont à la fois 0px, mais je ne suis pas sûr que c'est relevan
Pour plus d':
Pour
vertical
orientation, n'oubliez pas de définirheight
à 0dpPour
horizontal
orientation, n'oubliez pas de définirwidth
à 0dpCombinant à la fois des réponses de
Flo & rptwsthi et roetzi,
N'oubliez pas de changer votre
layout_width=0dp/px
, sinon lelayout_weight
comportement de loi à l'inverse avec le plus grand nombre occupé l'espace le plus petit et le plus faible nombre occupé le plus grand espace.En outre, certains des poids de combinaison causé une certaine mise en page ne peuvent pas être affichés (depuis le temps occupé l'espace).
Méfiez-vous de cela.
Ajoutant
android:autoSizeTextType="uniform"
redimensionner le texte automatiquement pour vousComme son nom l'indique, la Mise en page de poids indique quel est le montant ou le pourcentage de l'espace un champ ou d'un widget devrait occuper l'espace de l'écran.
Si l'on précise poids à l'horizontale, alors nous devons spécifier
layout_width = 0px
.De même, Si l'on précise poids dans l'orientation verticale, alors nous devons spécifier
layout_height = 0px
.