web-dev-qa-db-fra.com

Disposition linéaire et poids en Android

Je lis toujours à propos de cette valeur de poids amusante dans les documentations Android. Maintenant, je veux l'essayer pour la première fois, mais ça ne marche pas du tout.

D'après ce que je comprends des documentations, cette mise en page:

  <LinearLayout
     Android:layout_width="fill_parent"
     Android:layout_height="wrap_content"
     Android:orientation="horizontal">

     <Button
        Android:text="Register"
        Android:id="@+id/register"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:padding="10dip"
        weight="1" />

     <Button
        Android:text="Not this time"
        Android:id="@+id/cancel"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:padding="10dip"
        weight="1" />

  </LinearLayout>

devrait créer deux boutons alignés horizontalement et partageant l’espace de manière égale. Le problème est que les deux boutons ne poussent pas pour remplir l'espace.

Je voudrais que les boutons grandissent et remplissent toute la ligne. Si les deux boutons sont définis pour correspondre au parent, seul le premier bouton est affiché et remplit toute la ligne.

248
Janusz

Vous ne définissez pas la propriété layout_weight. Votre code lit weight="1" et il devrait lire Android:layout_weight="1".

150
JeremyFromEarth

3 choses à retenir:

  • définir le Android: layout_width des enfants sur "0dp"
  • définir le Android: weightSum du parent ( modifier: comme Jason Moore l’a remarqué, cet attribut est facultatif car, par défaut, il est défini sur la somme mise en page pour les enfants)
  • définir le Android: layout_weight de chaque enfant proportionnellement (par exemple, weightSum = "5", trois enfants: layout_weight = "1", layout_weight = "3", layout_weight = "1")

Exemple:

    <LinearLayout
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:weightSum="5">

    <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="3"
        Android:text="2" />

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

    </LinearLayout>

Et le résultat:

Layout weight example

659
Anke

C'est Android:layout_weight. Le poids ne peut être utilisé que dans LinearLayout. Si l'orientation de la représentation linéaire est Vertical, utilisez Android:layout_height="0dp" et si l'orientation est horizontale, utilisez Android:layout_width = "0dp". Cela fonctionnera parfaitement.

52
Manoj Seelan

Cette image résume la mise en page linéaire.

Linear Layout and Weight

Vous pouvez suivre ce lien pour plus d'informations sur le sujet. Just Maths - Vues, ​​groupes de vues et mises en page

Didacticiel vidéo pour la mise en page linéaire: largeur, hauteur et poids

Tutoriel de mise en page linéaire Android

23
Cheezy Code

Essayez de régler le layout_width des deux boutons sur "0dip" et le weight des deux boutons sur 0.5.

16
jqpubliq

Dans le champ largeur du bouton, remplacez wrap-content par 0dp.
Utilise l'attribut layout_weight d'une vue.

Android:layout_width="0dp"  

Voici à quoi ressemblera votre code:

<LinearLayout
 Android:layout_width="fill_parent"
 Android:layout_height="wrap_content"
 Android:orientation="horizontal">

 <Button
    Android:text="Register"
    Android:id="@+id/register"
    Android:layout_width="0dp"
    Android:layout_height="wrap_content"
    Android:padding="10dip"
    Android:layout_weight="1" />

 <Button
    Android:text="Not this time"
    Android:id="@+id/cancel"
    Android:layout_width="0dp"
    Android:layout_height="wrap_content"
    Android:padding="10dip"
    Android:layout_weight="1" />    

</LinearLayout>

layout_weight est utilisé pour répartir l’espace restant en proportions. Dans ce cas, les deux boutons prennent "0dp" en largeur. Ainsi, l’espace restant sera divisé en une proportion de 1: 1, c’est-à-dire que l’espace sera divisé de manière égale entre les vues de boutons.

7
Green goblin

LinearLayout permet d'attribuer un poids à des enfants individuels. Cet attribut attribue une valeur "importance" à une vue et lui permet de se développer pour remplir tout espace restant dans la vue parent. Le poids par défaut est zéro

calcul pour affecter n'importe quel Restant/Extra espace entre enfants. (pas l'espace total)

espace assigné à l'enfant = (poids individuel de l'enfant)/(somme du poids de chaque enfant dans la disposition linéaire)

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), alors Restant/Extra = espace assigné à

1st text box = 1/(1+1+0) 
2nd text box = 1/(1+1+0) 
3rd text box = 0/(1+1+0) 

Exemple (2): supposons que nous ayons une étiquette de texte et deux éléments d'édition de texte dans une ligne horizontale. Le libellé ne spécifiant pas layout_weight, il occupe donc l'espace minimum requis pour le rendu. Si la valeur pondérale de chacun des deux éléments d'édition de texte est définie sur 1, la largeur restante de la présentation parent sera divisée en parts égales entre eux (car nous affirmons qu'ils sont tout aussi importants).

calculation : 
1st label = 0/(0+1+1) 
2nd text box = 1/(0+1+1) 
3rd text box = 1/(0+1+1)

Si la première zone de texte a un layout_weight de 1 et que la deuxième zone de texte a un layout_weight de 2, un tiers de l'espace restant sera attribué à la première et les deux tiers à la seconde (car nous affirmons que le second est plus important).

calculation : 
1st label = 0/(0+1+2) 
2nd text box = 1/(0+1+2) 
3rd text box = 2/(0+1+2) 
7
Rakesh Soni

Comme réponse de @ Manoj Seelan

Remplacez Android:layout_weight par Android:weight.

Lorsque vous utilisez Poids avec LinearLayout. vous devez ajouter weightSum dans LinearLayout et selon l'orientation de votre LinearLayout, vous devez définir 0dp pour Largeur/Hauteur à toutes les vues de LinearLayout` Enfants

Exemple :

Si L'orientation de Linearlayout est Vertical, puis définissez la largeur de toutes les vues d'enfants de LinearLayout avec 0dp

 <LinearLayout
     Android:layout_width="fill_parent"
     Android:layout_height="wrap_content"
     Android:orientation="vertical"
     Android:weightSum="3">

     <Button
        Android:text="Register"
        Android:id="@+id/register"
        Android:layout_width="0dp"
        Android:layout_height="wrap_content"
        Android:padding="10dip"
        Android:layout_weight="2" />

     <Button
        Android:text="Not this time"
        Android:id="@+id/cancel"
        Android:layout_width="0dp"
        Android:layout_height="wrap_content"
        Android:padding="10dip"
        Android:layout_weight="1" />

  </LinearLayout>

Si l'orientation Linearlayout sur est horizontal, alors définissez la hauteur de toutes les vues de LinearLayout`s avec 0dp.

 <LinearLayout
     Android:layout_width="fill_parent"
     Android:layout_height="wrap_content"
     Android:orientation="horizontal"
     Android:weightSum="3">

     <Button
        Android:text="Register"
        Android:id="@+id/register"
        Android:layout_width="wrap_content"
        Android:layout_height="0dp"
        Android:padding="10dip"
        Android:layout_weight="2" />

     <Button
        Android:text="Not this time"
        Android:id="@+id/cancel"
        Android:layout_width="wrap_content"
        Android:layout_height="0dp"
        Android:padding="10dip"
        Android:layout_weight="1" />

  </LinearLayout>
6
ahmed hamdy

Peut-être que définir les deux propriétés du bouton layout_width sur "fill_parent" fera l'affaire.

Je viens de tester ce code et cela fonctionne dans l'émulateur:

<LinearLayout Android:layout_width="fill_parent"
          Android:layout_height="wrap_content">

    <Button Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:layout_weight="1"
        Android:text="hello world"/>

    <Button Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:layout_weight="1"
        Android:text="goodbye world"/>

</LinearLayout>

Assurez-vous de définir layout_width sur "fill_parent" sur les deux boutons.

5
JeremyFromEarth
<LinearLayout
        xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:id="@+id/logonFormButtons"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:baselineAligned="true"       
        Android:orientation="horizontal">

        <Button
            Android:id="@+id/logonFormBTLogon"
            Android:layout_width="fill_parent"
            Android:layout_height="wrap_content"            
            Android:text="@string/logon"
            Android:layout_weight="0.5" />

        <Button
            Android:id="@+id/logonFormBTCancel"
            Android:layout_width="fill_parent"
            Android:layout_height="wrap_content"            
            Android:text="@string/cancel"
            Android:layout_weight="0.5" />
    </LinearLayout>
4
Yar

Tu dois écrire comme ça sa travaille pour moi

<LinearLayout
         Android:layout_width="fill_parent"
         Android:layout_height="wrap_content"
         Android:orientation="horizontal"
            Android:weightSum="2">

         <Button
            Android:text="Register"
            Android:id="@+id/register"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:padding="10dip"
            Android:layout_weight="1" />

         <Button
            Android:text="Not this time"
            Android:id="@+id/cancel"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:padding="10dip"
            Android:layout_weight="1" />
2
Dinesh Saini

De plus, vous devez ajouter ceci Android:layout_width="0dp" pour les vues d'enfants [Vues de bouton] de LinerLayout

2
Rebeka

Dans le code XML ci-dessus, définissez le Android:layout_weight de la présentation linéaire sur 2: Android:layout_weight="2"

2
Priyanka

Vous trouverez ci-dessous les modifications (marquées entre BOLD) dans votre code:

<LinearLayout
     Android:layout_width="fill_parent"
     Android:layout_height="wrap_content"
     Android:orientation="horizontal">

     <Button
        Android:text="Register"
        Android:id="@+id/register"
        Android:layout_width="0dp" //changes made here
        Android:layout_height="wrap_content"
        Android:padding="10dip"
        Android:layout_weight="1" /> //changes made here

     <Button
        Android:text="Not this time"
        Android:id="@+id/cancel"
        Android:layout_width="0dp" //changes made here
        Android:layout_height="wrap_content"
        Android:padding="10dip"
        Android:layout_weight="1" /> //changes made here

  </LinearLayout>

Puisque votre LinearLayout a une orientation horizontale, vous devez donc conserver votre largeur uniquement sous la forme 0dp. pour pouvoir utiliser des poids dans cette direction. (Si votre orientation était verticale, vous n'auriez gardé que votre hauteur 0dp) .

Puisqu'il y a 2 vues et que vous avez placé Android:layout_weight="1" pour les deux vues, cela signifie que les deux vues seront divisées de manière égale dans le sens horizontal (ou en largeur).

1
Akshay Chopra
 <LinearLayout
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content">

    <Button
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:layout_weight="2"
        Android:text="Button 1" />

    <Button
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:layout_weight="3"
        Android:text="Button 2" />

    <Button
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:layout_weight="2"
        Android:text="Button 3" />

    </LinearLayout>
1
Katrina Khan

Remplacez wrap_content par fill_parent.

0
Humberto Pinheiro
 <LinearLayout
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:layout_gravity="center"
            Android:background="#008">

            <RelativeLayout
                Android:id="@+id/paneltamrin"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:layout_weight="1"
                Android:gravity="center"

                >
                <Button
                    Android:id="@+id/BtnT1"
                    Android:layout_width="wrap_content"
                    Android:layout_height="150dp"
                    Android:drawableTop="@Android:drawable/ic_menu_edit"
                    Android:drawablePadding="6dp"
                    Android:padding="15dp"
                    Android:text="AndroidDhina"
                    Android:textColor="#000"
                    Android:textStyle="bold" />
            </RelativeLayout>

            <RelativeLayout
                Android:id="@+id/paneltamrin2"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:layout_weight="1"
                Android:gravity="center"
                >
                <Button
                    Android:layout_width="wrap_content"
                    Android:layout_height="150dp"
                     Android:drawableTop="@Android:drawable/ic_menu_edit"
                    Android:drawablePadding="6dp"
                    Android:padding="15dp"
                    Android:text="AndroidDhina"
                    Android:textColor="#000"
                    Android:textStyle="bold" />

            </RelativeLayout>
        </LinearLayout>

enter image description here

C'est la réponse parfaite à votre problème

  <LinearLayout 
        xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:layout_width="fill_parent" 
        Android:layout_height="wrap_content"
        Android:orientation="horizontal"  >   
     <Button 
        Android:text="Register" Android:id="@+id/register"
        Android:layout_width="wrap_content" Android:layout_height="wrap_content"
        Android:padding="10dip" weight="1" />
     <Button 
        Android:text="Not this time" Android:id="@+id/cancel"
        Android:layout_width="wrap_content" Android:layout_height="wrap_content"
        Android:padding="10dip" weight="1" />
  </LinearLayout>
0
Rahul Mandaliya