Question Que signifie android: layout_weight?


Je ne comprends pas comment utiliser cet attribut. Quelqu'un peut-il m'en dire plus?


590
2017-10-22 10:10


origine


Réponses:


Avec layout_weight vous pouvez spécifier un rapport de taille entre plusieurs vues. Par exemple. tu as un MapView et un table qui devrait montrer quelques informations supplémentaires à la carte. La carte devrait utiliser 3/4 de l'écran et la table devrait utiliser 1/4 de l'écran. Ensuite, vous définirez 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 (en fonction de votre orientation) à 0px.


794
2017-10-22 10:55



En un mot, 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 à des enfants individuels. Cet attribut affecte une valeur "importance" à une vue et lui permet de se développer pour remplir tout espace restant dans la vue parente. Le poids par défaut des vues est zéro.

Calcul pour affecter tout espace restant entre l'enfant

En général, la formule est:

espace assigné à child = (poids individuel de l'enfant) / (somme du poids de chaque enfant dans Linear Layout)

Exemple 1

S'il y a trois zones de texte et que deux d'entre elles déclarent un poids de 1, alors que le troisième n'a pas de poids (0), 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 une étiquette de texte et deux éléments d'édition de texte dans une rangée horizontale. L'étiquette n'a pas layout_weight spécifié, il prend donc l'espace minimum requis pour le rendu. Si la layout_weight de chacun des deux éléments d'édition de texte est mis à 1, la largeur restante dans la mise en page parente sera partagée également entre eux (parce que nous prétendons qu'ils sont tout aussi importants).

Calcul:

1ère étiquette = 0 / (0 + 1 + 1)

2ème zone de texte = 1 / (0 + 1 + 1)

3ème zone de texte = 1 / (0 + 1 + 1)

Si, au contraire, 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, alors un tiers de l'espace restant sera donné à la première, et deux tiers à la seconde (parce que nous prétendons que le second est plus important).

Calcul:

1ère étiquette = 0 / (0 + 1 + 2)

2ème zone de texte = 1 / (0 + 1 + 2)

3ème zone de texte = 2 / (0 + 1 + 2)


Article source


226
2017-10-22 10:46



En ajoutant aux autres réponses, la chose la plus importante pour que cela fonctionne est de définir la largeur de la mise en page (ou la hauteur) à 0px

android:layout_width="0px"

sinon vous verrez des ordures


64
2017-08-15 07:52



S'il y a plusieurs vues couvrant un LinearLayout, puis layout_weight leur donne chacun une taille proportionnelle. Une vue avec un plus grand layout_weight la valeur "pèse" plus, donc elle devient plus grande.

Voici une image pour rendre les choses plus claires.

enter image description here

Théorie

Le terme poids de mise en page est lié au concept de moyenne pondérée en maths. C'est comme dans une classe de collège où les devoirs valent 30%, la fréquentation vaut 10%, la mi-session vaut 20% et la finale vaut 40%. Vos scores pour ces parties, lorsqu'elles sont pondérées ensemble, vous donnent votre note totale.

enter image description here

C'est la même chose pour le poids de mise en page. le Views dans un horizontal LinearLayout chacun peut prendre un certain pourcentage de la largeur totale. (Ou un pourcentage de la hauteur pour une verticale LinearLayout.)

La disposition

le LinearLayout que vous utiliserez ressemblera à ceci:

<LinearLayout
    android: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 le LinearLayout. Si tu utilises wrap_contentalors ça ne marchera pas. Notez également que layout_weight 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 un horizontal LinearLayout ressemble à ceci:

<Button
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1" />

Notez que vous devez utiliser layout_width="0dp" ensemble avec layout_weight="1". Oublier cela cause de nombreux problèmes aux nouveaux utilisateurs. (Voir Cet article pour des résultats différents, vous pouvez obtenir en ne définissant pas la largeur à 0.) Si vos vues sont dans un verticale  LinearLayout alors vous utiliseriez layout_height="0dp", bien sûr.

dans le Button exemple ci-dessus, je mets le poids à 1, mais vous pouvez utiliser n'importe quel nombre. C'est seulement le total qui compte. Vous pouvez voir dans les trois rangées de boutons dans la première image que j'ai posté, les chiffres sont tous différents, mais puisque 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 pour que dans une mise en page complexe, le poids de chaque partie soit clair.

Une dernière note. Si vous avez beaucoup de mises en page imbriquées qui utilisent layout_weight, ça peut être mauvais pour la performance.

Supplémentaire

Voici la mise en page XML pour l'image du haut:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="android:layout_weight="
        android:textSize="24sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="1" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="2"
            android:text="2" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="1" />

    </LinearLayout>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="android:layout_weight="
        android:textSize="24sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="10"
            android:text="10" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="20"
            android:text="20" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="10"
            android:text="10" />

    </LinearLayout>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="android:layout_weight="
        android:textSize="24sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".25"
            android:text=".25" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".50"
            android:text=".50" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".25"
            android:text=".25" />

    </LinearLayout>

</LinearLayout>

31
2018-04-18 06:29



layout_weight dit à Android comment distribuer votre Views dans un LinearLayout. Android calcule ensuite la proportion totale requise pour tous Views qui ont un poids spécifié et place chaque View en fonction de la fraction de l'écran dont il a besoin. Dans l'exemple suivant, Android voit que TextViews ont un layout_weight de 0 (Ceci est la valeur par défaut) et le EditTexts ont un layout_weight de 2 chacun, tandis que Button a un poids de 1. Donc, Android alloue «juste assez» d'espace pour afficher tvUsername et tvPassword puis divise le reste de la largeur de l'écran en 5 parties égales, dont deux sont alloués à etUsername, deux à etPassword et la dernière partie à bLogin:

<LinearLayout android:orientation="horizontal" ...>

    <TextView android:id="@+id/tvUsername" 
    android:text="Username" 
    android:layout_width="wrap_content" ... />

    <EditText android:id="@+id/etUsername"
    android:layout_width="0dp"
    android:layout_weight="2" ... />

    <TextView android:id="@+id/tvPassword"
    android:text="Password"
    android:layout_width="wrap_content" />

    <EditText android:id="@+id/etPassword"
    android:layout_width="0dp"
    android:layout_weight="2" ... />

    <Button android:id="@+id/bLogin"
    android:layout_width="0dp"
    android:layout_weight="1"
    android:text="Login"... />

</LinearLayout>

Ça ressemble à:
landscape orientation et
portrait orientation


29
2018-02-23 15:42



Pensez-y de cette façon, sera plus simple

Si vous avez 3 boutons et que leurs poids sont 1,3,1 en conséquence, cela fonctionnera comme une table en HTML

Fournir 5 portions pour cette ligne: 1 portion pour le bouton 1, 3 portions pour le bouton 2 et 1 portion pour le bouton 1

Ce qui concerne,


15
2017-11-04 16:55



l'une des meilleures explications pour moi était celui-ci (du didacticiel Android, recherchez l'étape 7):

layout_weight est utilisé dans LinearLayouts pour attribuer une "importance" aux Vues dans la mise en page. Toutes les vues ont un poids de mise en page par défaut de zéro, ce qui signifie qu'elles occupent seulement autant de place à l'écran qu'elles doivent être affichées. L'attribution d'une valeur supérieure à zéro divisera le reste de l'espace disponible dans la vue parente, en fonction de la valeur du paramètre layout_weight de chaque View et de son rapport au poids layout_glass spécifié dans la présentation actuelle pour cet élément et d'autres éléments View.

Pour donner un exemple: disons que nous avons une étiquette de texte et deux éléments d'édition de texte dans une rangée horizontale. Le label n'a pas de layout_weight spécifié, donc il occupe l'espace minimum requis pour le rendu. Si le poids_dispositif de chacun des deux éléments d'édition de texte est défini sur 1, la largeur restante dans la mise en page parente sera répartie également entre eux (parce que nous prétendons qu'ils sont tout aussi importants). Si le premier a un layout_weight de 1 et le second un layout_weight de 2, alors un tiers de l'espace restant sera donné au premier, et deux tiers au second (parce que nous prétendons que le second est plus important).


9
2017-07-19 19:16



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.


5
2017-10-22 10:42