¿Cómo alinear LinearLayout en el centro de su padre?


80

He examinado numerosas preguntas similares aquí en SO, pero nada ayuda. Tengo una jerarquía de diferentes diseños anidados, todos tienen android:layout_width="fill_parent", y el diseño más interno tiene android:layout_width="wrap_content: necesito alinearlo en el centro (horizontalmente). ¿Cómo puedo hacer eso?

Actualización: He encontrado la causa del problema: si coloco LinearLayout interno en RelativeLayout con android:layout_width="fill_parent", todavía envuelve su contenido. Sin embargo, TableRow realmente está llenando la pantalla.

<?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>

Respuestas:


230

Estos dos atributos se confunden comúnmente:

  • android:gravity establece la gravedad del contenido de la Vista en la que se usa.
  • android:layout_gravityestablece la gravedad de la vista o el diseño en relación con su padre .

Así que coloque android:gravity="center"el padre o android:layout_gravity="center"el LinearLayout mismo.

Me he sorprendido varias veces mezclándolos y preguntándome por qué las cosas no se estaban centrando correctamente ...


1
He tratado android:layout_gravity="center"de la disposición que contiene los TextViews - no ayuda, que todavía está alineado a la izquierda. También intenté establecer el ancho de este diseño en wrapy fill- sin diferencia.
Jirafa violeta

1
¿Ha intentado utilizar la herramienta Pixel Perfect en Eclipse? Le muestra los bordes de los diseños en una versión en vivo de su aplicación, por lo que generalmente puede descubrir dónde se equivocó.
jkschneider

+1 para explicar la confusa diferencia entre el uso del elemento y el padre de la palabra clave "gravedad".
scatmoi

+1 porque resuelve mi problema. Mi ejemplo => Tengo un diseño lineal y una vista de texto en él. Funciona para texview. Centra el tw horizontalmente.
alicanbatur

Sin layout_gravity para LinearLayout
Sayka

15

Intente esto en su diseño lineal

android:layout_centerHorizontal="true"
android:layout_centerVertical="true"

2
estos parámetros son para RelativeLayout
danijax

2
Estos no son parámetros de diseño lineal
pcodex

No se puede utilizar en diseño lineal.
Christopher Smit

10
<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>

considere la posibilidad de envolver relatedLayout sobre LinearLayout. android:layout_centerHorizontal="true"colocará el centro de vista horizontal.


Ya lo intenté. ¡No funciona! No entiendo qué está pasando allí ... He publicado el código completo de mi XML, solo he recortado algunas otras filas de la tabla. ¿Qué pasa con mi diseño?
Jirafa violeta

Creo que tiene algo que ver con las filas de la tabla, agregan los niños a la izquierda. considere proporcionar layout_width = "fill_parent" para la etiqueta de fila de la tabla.
Yashwanth Kumar

para la configuración XML en esta respuesta, si sigue teniendo problemas puedes volver a los LinearLayout's layout_widthque deberían ser wrap_contenty no match_parent. La misma lógica se aplica para la alineación vertical
Kellogs

5

agregar layout_gravity="center"o "center_horizontal"al diseño principal.

En una nota al margen, tu LinearLayoutinterior TableRowparece innecesario, ya que a TableRowes una horizontal LinearLayout.


Es necesario, porque necesito que la tabla llene el padre y que solo se centren varias filas. Y layout_gravity no ayuda.
Jirafa violeta

3

Prueba esto:

<?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

Esto funcionó para mí ... agregando una vista vacía ...

<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>

2

Intente <TableRow android:gravity="center_horizontal">esto centrará el LinearLayout interno dentro de la fila de la tabla.


2

Me he enfrentado a la misma situación al diseñar una notificación personalizada. Lo he intentado con el siguiente atributo establecido con verdadero.

 android:layout_centerInParent.

2

esto funcionó para mí.

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

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

</LinearLayout>

por lo que está diseñando el Diseño lineal para colocar todo su contenido (TextView y Button) en su centro y luego TextView y Button se colocan en relación con el centro del Diseño lineal


1

La explicación de @jksschneider es casi correcta. Asegúrese de no haber configurado ninguno gravitypara el diseño principal y luego configure layout_gravity="center"su vista o diseño.


1

Experimenté esto mientras trabajaba con RelativeLayouts anidados. Mi solución terminó siendo simple, pero es un pequeño problema que vale la pena conocer.

Mi diseño se definió con ...

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

... sin embargo, no pensé que el diseño debajo de este estuviera colocado encima. Todo dentro de este diseño se desplazó hacia la parte inferior en lugar de centrarse. Añadiendo ...

android:layout_above="@id/bottomLayout"

... solucionó mi problema.


0

para ImageView u otras vistas cuyo diseño-gravedad o gravedad no existe use: android:layout_centerInParent="true"en el niño (tenía un diseño relativo con un ImageView cuando era niño).


0

El problema es que la gravedad de la raíz (el diseño principal donde almacena los otros elementos) no está configurada. Si lo cambia para centrar la gravedad de los otros elementos debe funcionar bien.


0

A continuación se muestra el código para poner su diseño lineal en la parte inferior y poner su contenido en el centro. Tienes que usar RelativeLayout para establecer Layout en la parte inferior.

<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>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.