est-il possible de distribuer uniformément les boutons sur la largeur d'un android linearlayout

j'ai une disposition linéaire (orientée horizontalement) qui contient 3 boutons. Je veux que les 3 boutons aient une largeur fixe et soient uniformément répartis sur toute la largeur de la disposition linéaire.

je peux gérer cela en réglant la gravité de la sortie linéaire au centre et en ajustant ensuite le rembourrage des boutons, mais cela fonctionne pour une largeur fixe et ne fonctionnera pas pour changer les appareils ou les orientations.

<LinearLayout android:id="@+id/LinearLayout01" 
android:layout_height="wrap_content" 
android:orientation="horizontal" 
android:layout_width="fill_parent" 
android:gravity="center">

<Button 
android:id="@+id/btnOne"
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:width="120dip"></Button>

<Button 
android:id="@+id/btnTwo"
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:width="120dip"></Button>


<Button 
android:id="@+id/btnThree"
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:width="120dip"></Button>

</LinearLayout>
196
demandé sur yamspog 2010-08-12 21:36:14

17 réponses

extension sur réponse de fedj , si vous mettez layout_width à 0dp et mettez le layout_weight pour chacun des boutons à 1, la largeur disponible sera partagée également entre les boutons.

277
répondu Dan Dyer 2017-05-23 12:03:05

si vous ne voulez pas que les boutons se dimensionnent, mais ajustez l'espacement entre les boutons( espacement égal entre tous les boutons), vous pouvez utiliser des vues avec le poids= "1" qui remplira l'espace entre les boutons:

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

    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:background="@null"
        android:gravity="center_horizontal|center_vertical"
        android:src="@drawable/tars_active" />

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

    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:background="@null"
        android:gravity="center_horizontal|center_vertical"
        android:src="@drawable/videos_active" />

    <Space
        android:layout_width="0dp"
        android:layout_height="1dp"
        android:layout_weight="1" >
    </Space>
186
répondu stoefln 2016-04-24 09:53:33

vous pouvez l'utiliser comme suit.

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_marginTop="15dp">
    <Space
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Save"/>
    <Space
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Reset"/>
    <Space
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="cancel"/>
    <Space
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"/>
</LinearLayout>
20
répondu Sandhu 2015-09-19 08:10:49

Vous pouvez le faire en donnant à la fois View s layout_width de 0dp et un layout_weight de 1 :

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

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

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

</LinearLayout>

la façon dont android layout_weight fonctionne est que:

  • tout d'abord, il ressemble à la taille qu'une vue prendrait normalement et Réserve cet espace.
  • deuxièmement, si le plan est match_parent alors il divisera l'espace qui est left in the ratio of the layout_weight s. Ainsi, si vous donnez les vues layout_weight="2" et layout_weight="1" , le rapport résultant sera de 2 à 1,c'est-à-dire que la première vue obtiendra 2/3 de l'espace qui reste et l'autre vue 1/3.

C'est pourquoi si vous donnez à layout_width une taille de 0dp la première étape n'a pas de sens ajouté puisque les deux vues ne sont pas affectées d'espace. Alors seulement le deuxième point décide l'Espace chaque View obtient, donnant ainsi au View s l'espace que vous avez spécifié selon le rapport!

expliquer pourquoi 0dp fait dévier l'espace de façon égale en fournissant un exemple qui montre le contraire: le code ci-dessous aboutirait à quelque chose de différent depuis example text a maintenant une largeur qui est plus grande que 0dp parce qu'il a wrap_content au lieu de faire l'espace libre laissé pour diviser moins de 100% parce que le texte prend de l'espace. Le le résultat sera qu'ils obtiennent 50% de l'espace libre gauche mais le texte a déjà pris un peu d'espace de sorte que le TextView aura bien plus de 50% de l'espace total.

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

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

    <TextView
        android:layout_width="wrap_content"
        android:text="example text"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>

</LinearLayout>
17
répondu Joop 2017-01-09 06:24:05

Eh bien, si vous avez exactement 3 boutons et s'il est ok (ou même prévu) que les boutons externes sont alignés à gauche et à droite, alors vous pourriez vouloir essayer une sortie relative qui est moins au-dessus (dans de nombreuses situations).

vous pouvez utiliser layout_alignParentBottom pour aligner tous les boutons avec le bas de la disposition. Utiliser layout_alignParentLeft and Right pour les boutons extérieurs et layout_centerHorizontal pour le bouton du milieu.

qui fonctionnera bien sur différentes orientations et les tailles d'écran.

13
répondu marsbear 2011-11-15 01:58:13

vous devriez jeter un oeil à android: layout_weight attribut

11
répondu fedj 2010-08-12 18:18:46

pour espacer de façon égale deux boutons dans un plan linéaire horizontal, j'ai utilisé 3 objets LinearLayout pour agir comme des espaces qui vont être redimensionnés automatiquement. J'ai positionné ces objets LinearLayout comme suit:

[] Button1 [] Bouton2 []

([] représente un LinearLayout objet utilisé pour l'espacement)

ensuite, j'ai réglé le poids de chacun de ces [] objets D'Affichage linéaire à 1, et j'obtiens des boutons uniformément espacés.

Espérons que cette aide.

4
répondu Muhammad 2012-05-30 23:51:12

j'ai créé une vue personnalisée DistributeLayout pour faire ceci.

4
répondu martyglaubitz 2014-07-11 13:13:32

je vous suggère D'utiliser L'attribut weightSum de LinearLayout.

ajout de l'étiquette android:weightSum="3" à la déclaration xml de votre LinearLayout et ensuite android:layout_weight="1" à vos boutons auront pour résultat que les 3 boutons seront distribués uniformément.

4
répondu matdev 2015-11-27 14:09:36

cela peut être réalisé en assignant weight à chaque bouton ajouté à l'intérieur du conteneur, il est très important de définir l'orientation horizontale:

    int buttons = 5;

    RadioGroup rgp = (RadioGroup) findViewById(R.id.radio_group);

    rgp.setOrientation(LinearLayout.HORIZONTAL);

    for (int i = 1; i <= buttons; i++) {
        RadioButton rbn = new RadioButton(this);         
        rbn.setId(1 + 1000);
        rbn.setText("RadioButton" + i);
        //Adding weight
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 1f);
        rbn.setLayoutParams(params);
        rgp.addView(rbn);
    }

donc nous pouvons obtenir cela dans notre appareil en conséquence:

enter image description here

même si nous faisons tourner notre appareil weight défini dans chaque bouton peut distribuer les éléments uniformément le long du conteneur:

enter image description here

4
répondu Jorgesys 2016-11-29 20:21:05

meilleure approche est D'utiliser TableLayout avec android:layout_width= "match_parent" et dans les colonnes utiliser android:layout_weight="1" pour toutes les colonnes

3
répondu Prashant 2014-10-30 08:59:47

les réponses ci-dessus en utilisant layout_ n'ont pas fonctionné pour moi, mais les suivantes l'ont fait.

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_weight="0.1"
    android:layout_gravity="center_horizontal"
    >

    <android.support.design.widget.FloatingActionButton
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_gravity="center"
       />

    <android.support.design.widget.FloatingActionButton
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_gravity="center"
        android:layout_marginLeft="40dp"
        android:layout_marginStart="40dp"/>

    <android.support.design.widget.FloatingActionButton
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_gravity="center"
        android:layout_marginLeft="40dp"
        android:layout_marginStart="40dp"
        />

    <android.support.design.widget.FloatingActionButton
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_gravity="center"
        android:layout_marginLeft="40dp"
        android:layout_marginStart="40dp"/>

</LinearLayout>

C'est la façon dont il regarde sur l'écran,

enter image description here

2
répondu sean le roy 2017-01-11 19:28:04

au-dessus de toutes les réponses sont justes, mais dans un cas vous avez besoin de traits visibles et partis alors cette méthode pragmatique fonctionnera bien

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

        <Button
            android:id="@+id/btnOne"
            android:layout_width="120dp"
            android:layout_height="match_parent"></Button>

        <Button
            android:id="@+id/btnTwo"
            android:layout_width="120dp"
            android:layout_height="match_parent"></Button>


        <Button
            android:id="@+id/btnThree"
            android:layout_width="120dp"
            android:layout_height="match_parent"></Button>
    </LinearLayout>



 float width=CommonUtills.getScreenWidth(activity);
            int cardWidth=(int)CommonUtills.convertDpToPixel (((width)/3),activity);

LinearLayout.LayoutParams params =
                new LinearLayout.LayoutParams(width,
                        LinearLayout.LayoutParams.MATCH_PARENT);

btnOne.setLayoutParams(params);
btnTwo.setLayoutParams(params);
btnThree.setLayoutParams(params);

public class CommonUtills {
public static float getScreenWidth(Context context) {
        float width = (float) 360.0;
        DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
        width = displayMetrics.widthPixels / displayMetrics.density;
        return width;
    }
}
2
répondu Rajesh Nasit 2017-08-26 10:34:03

la manière la plus simple et la plus rapide (mais pas la meilleure) est d'ajouter un attribut TextView avec un texte vide, comme ceci

android:text=""

la couleur d'arrière-plan doit être la même à la linéarisation, alors vous pouvez utiliser la propriété padding, comme ceci

android:paddingBottom="250dp"

ou tout ce dont vous avez besoin. voici un exemple.

2
répondu Cesar Bobadilla 2017-12-27 00:35:59
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<TextView
    android:text="Tom"
    android:layout_width="wrap_content"
    android:layout_height="200dp"
    android:textSize="24sp" />

<TextView
    android:text="Tim"
    android:layout_width="wrap_content"
    android:layout_height="200dp"
    android:textSize="24sp" />

<TextView
    android:text="Todd"
    android:layout_width="wrap_content"
    android:layout_height="200dp"
    android:textSize="24sp" />

1
répondu basem 2017-11-08 23:34:51

à pondération Égale, les enfants

pour créer une disposition linéaire dans laquelle chaque enfant utilise la même quantité de espace sur l'écran, mettez l'android: layout_height de chaque vue à "0dp" (pour une mise en page verticale) ou android:layout_width de chaque vue "0dp" (pour une mise en page horizontale). Puis définissez l'android:layout_weight de chaque vue à "1".

pour que cela fonctionne dans le LinearLayout view group les valeurs d'attribut pour android:layout_width et android:layout_height doivent être égales à "match_parent" ...

1
répondu Gibran Castillo 2018-01-13 23:43:47
<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:text="Tom"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="24sp" 
        android:layout_weight="3"/>

    <TextView
        android:text="Tim"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="24sp"
        android:layout_weight="3"/>

    <TextView
        android:text="Todd"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="24sp" 
        android:layout_weight="3"/>

</LinearLayout>

en cercle, Tom, Tim et Todd sont supposés être de 3 centimètres. Si vous voulez qu'il soit écran tactile, mettez-le comme Tom et Tim être supposé être 1 centimètre, ce qui signifie qu'ils combinent virtuel mais son plan 2D est au fond. C'est affiché sur l'écran.

0
répondu Dinesh Gowd 2017-06-11 18:37:36