2012-06-05 15 views
11

Estoy tratando de centrar horizontalmente varias vistas en un RelativeLayout que es una base.RelativeLayout gravedad centro no funciona

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:gravity="center_horizontal" 
    android:background="@android:color/transparent" > 

Esto no está funcionando. Establecí centerInParent en true para una de las vistas y eso funcionó. Sin embargo, no puedo usar esta solución porque tengo 2 vistas una al lado de la otra que deben centrarse juntas. Tratando de optimizar esto, quiero evitar diseños de anidamiento, especialmente Linear, uno dentro del otro.

¿Hay algo obvio que me falta? Pensé que este atributo está hecho para esta situación.

Respuesta

1

Así que mi solución para este problema resulta para aprovechar la característica de drawable compuesto de textview. Acabo de destrozar el botón y usé drawableRight para mostrar el ícono de búsqueda.

4

Tendrá que anidar varios diseños juntos. Para centrar algo en RelativeLayout, usa android:layout_centerInParent="true" en el niño. Si intentas centrar varios niños, terminarán debajo/sobre el uno del otro.

Por lo tanto, por ejemplo, podría usar un LinearLayout con dos vistas como secundario en RelativeLayout, con LinearLayout teniendo android:orientation="horizontal" y android:layout_centerInParent="true". LinearLayout ahora debe centrarse en RelativeLayout, con los dos hijos uno al lado del otro.

+1

estoy realmente tratando de optimizar esta pantalla ya que es la actividad principal. Por lo tanto, realmente estoy tratando de evitar anidar LinearLayouts. De hecho, estoy eliminando todas las linearlayouts de estas aplicaciones, ya que son terriblemente ineficientes. –

+3

Bueno, no hay forma de hacerlo (bien parecido) si no puede anidar diseños. Al menos hasta donde yo sé. –

2

Envuelva las dos vistas en LinearLayout y luego centre LinearLayout en RelativeLayout como lo hizo para el único TextView.

+0

No quiero anidar. Y eso todavía no explica el problema de que centerInParent funciona cuando se establece en true, pero no funciona cuando la gravedad se establece en center_horizontal –

+0

Pruebe 'android: layout_gravity =" center horizontal "' en sus vistas de texto. – Barak

+0

No. Gracias por la respuesta, pero eso no va a funcionar. Necesito dos botones para estar uno al lado del otro, así que center_horizontal para cada uno los colocará uno encima del otro. –

8

Respondí un problema similar con tres vistas sin utilizar ViewGroups anidados.

https://stackoverflow.com/a/13279846/1011746

Esto se prueba en API 11.

Para el caso horizontal dos vistas:

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:gravity="center" 
    android:background="@android:color/black" 
    > 
    <Button 
    android:id="@+id/apply" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:text="APPLY" 
    android:textSize="20sp" 
    /> 
    <Button 
    android:id="@+id/undo" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:text="UNDO" 
    android:textSize="20sp" 
    android:layout_toRightOf="@id/apply" 
    /> 
</RelativeLayout> 

Para el caso vertical de dos vista:

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:gravity="center" 
    android:background="@android:color/black" 
    > 
    <Button 
    android:id="@+id/apply" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:text="APPLY" 
    android:textSize="20sp" 
    /> 
    <Button 
    android:id="@+id/undo" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:text="UNDO" 
    android:textSize="20sp" 
    android:layout_below="@id/apply" 
    /> 
</RelativeLayout> 
+0

Esta solución solo funciona cuando las vistas se pueden apilar en una sola línea, si el diseño es más complejo, la única solución es usar diseños anidados como sugieren las otras respuestas o tomar una evaluación diferente. – TheIT

Cuestiones relacionadas