web-dev-qa-db-fra.com

Comment aligner LinearLayout au centre de son parent?

J'ai examiné de nombreuses questions similaires ici chez SO, mais rien n'y fait… .. J'ai une hiérarchie de mises en page imbriquées différentes, toutes ont Android:layout_width="fill_parent" et la mise en page la plus interne a Android:layout_width="wrap_content - je dois l'aligner au centre ( horizontalement). Comment je fais ça?

Mise à jour: : J'ai trouvé la cause du problème - si je mets le LinearLayout interne dans RelativeLayout avec Android:layout_width="fill_parent", le contenu est tout de même enveloppé. Le TableRow, cependant, remplit vraiment l'écran.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:orientation="vertical" >
    <FrameLayout
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content" >
        <TableLayout
            Android:layout_width="fill_parent"
            Android:layout_height="wrap_content" >
            <TableRow >
            <LinearLayout 
            Android:orientation="horizontal"
                    Android:layout_width="wrap_content"
                    Android:layout_height="wrap_content">
                    <TextView
                    Android:layout_height="wrap_content"
                    Android:layout_width="wrap_content"
                    Android:text="1"
                    Android:textAppearance="?android:attr/textAppearanceLarge" />

                     <TextView
                    Android:layout_height="wrap_content"
                    Android:layout_width="wrap_content"
                    Android:text="2"
                    Android:textAppearance="?android:attr/textAppearanceLarge" />
             </LinearLayout>
           </TableRow>
        </TableLayout>
    </FrameLayout>
</LinearLayout>
69
Violet Giraffe

Ces deux attributs sont souvent confondus:

  • Android:gravity définit la gravité du contenu de la vue sur laquelle il est utilisé. 
  • Android:layout_gravity définit la gravité de la vue ou Layout par rapport à son parent .

Donc, mettez soit Android:gravity="center" sur le parent ou Android:layout_gravity="center" sur le LinearLayout lui-même.

Je me suis surpris à les mélanger plusieurs fois et à me demander pourquoi les choses ne se concentraient pas correctement ...

199
jkschneider

S'il vous plaît essayez cela dans votre mise en page linéaire 

Android:layout_centerHorizontal="true"
Android:layout_centerVertical="true"
16
Lakshmanan
<RelativeLayout
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    >
    <LinearLayout 
            Android:orientation="horizontal"
            Android:layout_centerHorizontal="true"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content">
            <TextView
                 Android:layout_height="wrap_content"
                 Android:layout_width="wrap_content"
                 Android:text="1"
                 Android:textAppearance="?android:attr/textAppearanceLarge" />

           <TextView
                 Android:layout_height="wrap_content"
                 Android:layout_width="wrap_content"
                 Android:text="2"
                 Android:textAppearance="?android:attr/textAppearanceLarge" />
    </LinearLayout>
</RelativeLayout>

envisagez de placer relativeLayout sur LinearLayout. Android:layout_centerHorizontal="true" positionnera le centre de la vue horizontalement.

9
Yashwanth Kumar

ajoutez layout_gravity="center" ou "center_horizontal" à la mise en page parent.

Sur une note de côté, votre LinearLayout dans votre TableRow ne semble pas nécessaire, puisqu'un TableRow est déjà un horizontal LinearLayout.

5
Emmanuel Sys

Cela a fonctionné pour moi .. ajouter une vue vide ..

<LinearLayout
       Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
       Android:layout_gravity="center_horizontal"
        Android:orientation="horizontal"
         >
<View
            Android:layout_width="0dp"
            Android:layout_height="0dp"
            Android:layout_weight="1"
            />  
     <com.google.Android.gms.ads.AdView

         Android:id="@+id/adView"
         Android:layout_width="wrap_content"
         Android:layout_height="wrap_content"

         Android:layout_gravity="center_horizontal"
         ads:adSize="BANNER"
         ads:adUnitId="@string/banner_ad_unit_id" >

    </com.google.Android.gms.ads.AdView>
    <View
            Android:layout_width="0dp"
            Android:layout_height="0dp"
            Android:layout_weight="1"
            />  
    </LinearLayout>
3
gitesh devhane

Essaye ça:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:orientation="vertical"
    >
    <FrameLayout
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content" >
        <TableLayout
            Android:layout_width="fill_parent"
            Android:layout_height="wrap_content" >
            <TableRow >
            <LinearLayout 
            Android:orientation="horizontal"
                    Android:layout_width="wrap_content"
                    Android:layout_height="wrap_content"
                    Android:gravity="center_horizontal" 
                    Android:layout_gravity="center_horizontal" >
                    <TextView
                    Android:layout_height="wrap_content"
                    Android:layout_width="wrap_content"
                    Android:text="1"
                    Android:textAppearance="?android:attr/textAppearanceLarge" />

                     <TextView
                    Android:layout_height="wrap_content"
                    Android:layout_width="wrap_content"
                    Android:text="2"
                    Android:textAppearance="?android:attr/textAppearanceLarge" />
             </LinearLayout>
           </TableRow>
        </TableLayout>
    </FrameLayout>
</LinearLayout>
3
Hiral

Try <TableRow Android:gravity="center_horizontal"> Ceci centre la LinearLayout interne dans le tablerow.

2
triggs

J'ai fait face à la même situation lors de la conception d'une notification personnalisée. J'ai essayé avec l'attribut suivant défini avec true.

 Android:layout_centerInParent.
2
Karthikeyan Ve

Je l'ai expérimenté en travaillant avec RelativeLayouts imbriqué. Ma solution s’est avérée simple, mais c’est une petite chose à ne pas manquer.

Ma mise en page a été définie avec ...

Android:layout_height="fill_parent"
Android:layout_below="@id/someLayout
Android:gravity="center"

... cependant, je ne pensais pas que la mise en page en dessous de celle-ci était placée dessus. Tout ce qui était à l'intérieur de cette disposition était déplacé vers le bas au lieu d'être centré. Ajouter...

Android:layout_above="@id/bottomLayout"

... corrigé mon problème.

1
Crash5998

cela a fonctionné pour moi.

<LinearLayout>
.
.
.
Android:gravity="center"
.
.>

<TextView
Android:layout_gravity = "center"
/>
<Button
Android:layout_gravity="center"
/>

</LinearLayout>

vous concevez donc la disposition linéaire pour placer tout son contenu (TextView et Button) en son centre, puis la vue TextView et le bouton sont placés par rapport au centre de la disposition linéaire.

1
Prab

@jksschneider explication est presque juste. Assurez-vous que vous n'avez pas défini gravity sur la disposition parente, puis définissez layout_gravity="center" sur votre vue ou disposition.

1
Pawan

pour les vues ImageView ou autres pour lesquelles la gravure physique ou la gravure n'existe pas, utilisez:. Android:layout_centerInParent="true" dans l'enfant (J'avais une disposition relative avec un ImageView en tant qu'enfant).

0
bastami82

Le problème est que la gravité de root (la disposition principale dans laquelle vous stockez les autres éléments) n'est pas définie. Si vous le changez en center , la gravité des autres éléments doit fonctionner correctement. 

0
Marin Karadzhov

Vous trouverez ci-dessous le code pour placer votre Linearlayout en bas et son contenu au centre. Vous devez utiliser RelativeLayout pour définir Layout en bas. 

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical">

  <LinearLayout
    Android:layout_width="match_parent"
    Android:layout_height="50dp"
    Android:background="#97611F"
    Android:gravity="center_horizontal"
    Android:layout_alignParentBottom="true"
    Android:orientation="horizontal">

    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="50dp"
        Android:text="View Saved Searches"
        Android:textSize="15dp"
        Android:textColor="#fff"
        Android:gravity="center_vertical"
        Android:visibility="visible" />
    <TextView
        Android:layout_width="30dp"
        Android:layout_height="24dp"
        Android:text="12"
        Android:textSize="12dp"
        Android:textColor="#fff"
        Android:gravity="center_horizontal"
        Android:padding="1dp"
        Android:visibility="visible" />
  </LinearLayout>  
</RelativeLayout>
0
Kalpesh Patil