2011-12-17 8 views
33

Tengo un RelativeLayout que contiene un par de botones uno al lado del otro, y quiero centrarme en el diseño. Podría simplemente colocar los botones en LinearLayout y centrar eso en RelativeLayout, pero quiero mantener mi xml lo más limpio posible.¿Centro de artículos múltiples en un RelativeLayout sin ponerlos en un contenedor?

Esto es lo que he intentado, esto sólo pone el botón "aplicar" en el centro y el botón a la izquierda de la misma "deshacer":

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="15sp"> 
    <TextView 
    android:id="@+id/instructions" 
    android:text="@string/instructions" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginBottom="15sp" 
    android:layout_centerHorizontal="true" 
    /> 
    <Button 
    android:id="@+id/apply" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:text="@string/apply" 
    android:textSize="20sp" 
    android:layout_below="@id/instructions" 
    /> 
    <Button 
    android:id="@+id/undo" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:text="@string/undo" 
    android:textSize="20sp" 
    android:layout_toLeftOf="@id/apply" 
    android:layout_below="@id/instructions" 
    /> 
</RelativeLayout> 

Respuesta

57

android:gravity alineará el contenido dentro de view o layout en el que se utiliza.

android:layout_gravity alineará el view o layout dentro de su padre.

por lo que añadir

android:gravity="center" 

a su RelativeLayout debe hacer el truco ...

De esta manera:

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:gravity="center" 
    android:layout_marginTop="15sp"> 

</RelativeLayout> 
+0

¿Puedes dar un ejemplo de diseño, por favor? No veo cómo esto puede funcionar porque tienes que colocar un botón a la izquierda del segundo y viceversa, que es una dependencia circular. Lo cual arroja una IllegalStateException en RelativeLayout. –

+0

Probado por mí mismo ... solo use el código en la pregunta y agregue la línea como dije ... – BrainCrash

+0

Ohh Veo, me malinterpreté "centro en RelativeLayout" como vertical y horizontal - en lugar de centro horizontal debajo de la vista de texto. Esto tiene sentido entonces. –

2

LinearLayout es una buena opción. Aparte de eso, hay opciones como crear una vista invisible y centrar eso y luego alinear el botón izquierdo a la izquierda y a la derecha a la derecha. PERO esos son solo problemas.

+0

Sí, es una solución fea, pero es la mejor que he encontrado. Cree la vista espaciadora o cree un RelativeLayout/LinearLayout que contenga, de modo que otra vista debe inflarse, pero esto evita la sobrecarga de tener ViewGroups anidados. –

+0

@havexz Perdón por el downvote, ya que de hecho incorporé un diseño separado para obtener el centrado que necesitaba. Fui demasiado apresurado para descartar tu respuesta, porque el problema específico aquí fue más "limpiamente" resuelto por la respuesta de BrianCrash. Sin embargo, cuando empujé esa solución un poco más, no fue suficiente. ¿No me permitirá deshacer o subir el voto tampoco? – samosaris

+0

@SamusArin Para deshacer una votación, haga clic nuevamente en el ícono de voto. – mindriot

5
android:layout_gravity="center" 

casi le dará lo que está buscando.

+0

Omg, respondió esto exactamente al mismo tiempo que BrianCrash. Bajé votando b/c Creí que habías copiado su respuesta. Lo siento, hombre (¡trataré de arreglar el voto a la baja)! – samosaris

+0

Ok, todo mejor (gracias a la edición de Jean). – samosaris

4

Aquí es una combinación de la respuesta anterior de que resolviera mi situación específica :

Centrar dos etiquetas separadas dentro de un diseño que también incluye un botón en la posición más a la izquierda del mismo diseño (botón, etiqueta, etiqueta, de izquierda a derecha, donde las etiquetas están centradas en relación con el diseño que contiene las tres vistas, es decir, el botón no empuja las etiquetas al centro) .

Lo resolví anidando dos RelativeLayout, donde el diseño más externo incluía el botón y un Inner-Relative Layout.

El Inner-RelativeLayout contenía las dos etiquetas de texto (TextView).

Aquí hay un fragmento que proporciona los detalles de cómo se hizo el centrado y la otra materia de diseño:

véase: RelativeLayout Gravity not applied? y Gravity and layout_gravity on Android por la diferencia entre la gravedad y de layout_gravity.

Ajustar el rellenoLectura en el botón btn_button1 para ver que los TextView no se muevan.

(Mis disculpas a havexz para los downvotes. Yo era demasiado apresurado en pensar que sólo b/c sus sugerencias no resolvió la cuestión que se pida exacta, que ayudan a resolver situaciones muy similares (la respuesta aquí resuelve una situación muy específica, y solo la combinación de todas estas respuestas resolvió mi problema. Intenté la votación ascendente, pero no me permitirá a menos que edite las respuestas, lo que no quiero hacer.)

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/rl_outer" 
    android:layout_width="fill_parent" 
    android:layout_height="50dip" 
    android:background="#FF0000FF"> 

    <Button 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/btn_button1" 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent" 
    android:background="#FF00FF00" 
    android:text="&lt;" 
    android:textSize="20sp" 
    android:paddingLeft="40dip"/> 

    <RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/rl_inner" 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent" 
    android:background="#FFFF00FF"   
    android:layout_centerInParent="true" 
    android:gravity="center">  

    <TextView 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/tv_text1" 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 
     android:background="#FF505050" 
     android:textSize="20sp" 
     android:textColor="#FFFFFFFF" 
     android:text="Complaint #" 
     android:gravity="center"/>  

    <TextView 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/tv_text2" 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 
     android:background="#FF505050" 
     android:textSize="20sp" 
     android:textColor="#FFFFFFFF" 
     android:layout_toRightOf="@id/tv_text1" 
     android:gravity="center"/> 

    </RelativeLayout> 
</RelativeLayout> 
+1

android: layout_centerInParent = "true" hizo el truco –

8

Aquí hay una extensión de la respuesta de BrainCrash. Es una opción no anidada que agrupa y centra los tres horizontal y verticalmente. Además, toma el TextView superior y lo centra horizontalmente en ambos botones. Si lo desea, puede centrar el texto dentro de TextView con android: gravity = "center". También eliminé los márgenes, agregué color y configuré la altura de RelativeLayout en fill_parent para resaltar el diseño. Probado en API 11.

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:gravity="center" 
    android:background="@android:color/black" 
    > 
    <TextView 
    android:id="@+id/instructions" 
    android:text="TEST" 
    android:textSize="20sp" 
    android:background="@android:color/darker_gray" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerHorizontal="true" 
    android:layout_alignLeft="@+id/undo" 
    android:layout_alignRight="@+id/apply" 
    android:gravity="center" 
    /> 
    <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" 
    android:layout_below="@id/instructions" 
    /> 
    <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_toLeftOf="@id/apply" 
    android:layout_below="@id/instructions" 
    /> 
</RelativeLayout> 
Cuestiones relacionadas