¿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>
Jirafa violeta
fuente

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

jkschneider
fuente
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"
Lakshmanan
fuente
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.

Yashwanth Kumar
fuente
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.

Emmanuel Sys
fuente
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>
Hiral Vadodaria
fuente
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>
gitesh devhane
fuente
2

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

disparos
fuente
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.
Karthikeyan Ve
fuente
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

pcodex
fuente
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.

Pawan
fuente
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.

Crash5998
fuente
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).

bastami82
fuente
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.

Marin Karadzhov
fuente
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>
Kalpesh Patil
fuente