2011-03-30 52 views
21

Tengo un diseño relativo con dos hijos que también son RelativeLayouts que contienen algunos botones y otras cosas. Estos diseños para niños no están centrados en mi diseño principal, y el diseño principal contiene algunas otras cosas fuera de los lados de estos dos. Quiero que el primero esté encima del segundo. Eso es bastante fácil, solo use android:layout_below="@+id/firstLayout" en el segundo. Pero también quiero que el segundo se alinee en el centro del primero. Con eso quiero decir que quiero que el segundo diseño encuentre el centro del primero, y que se alinee de modo que su centro esté en la misma posición x. Veo alignLeft, alignRight, alignTop y alignBaseline, pero no al centro. ¿Es posible hacerlo sin tener que codificar un margen para desplazar el segundo diseño sobre algunos?Diseño relativo de Android alignCenter desde otra vista

Aquí hay un ejemplo aproximado de lo que intento terminar, la barra azul sería la primera disposición, y la caja roja sería la segunda. Sé que podría envolverlos a ambos en otro diseño relativo que tenga tamaños iguales a "wrap_content" y luego use centerHorizontal = "true" para el segundo. Pero preferiría dejar a ambos como hijos de mi diseño principal (tendría que hacer algunos cambios en la forma en que funcionan ciertas partes de mi aplicación si los hago hijos de un diseño separado. Lo cual estoy tratando de evitar)

Example of what I want

Respuesta

8

Si se puede establecer el ancho de la disposición de los padres a "wrap_content", puede ponerlos ambos diseños infantiles para centrar

+2

Creo que quieres decir ancho. Pero este enfoque no funcionará porque hay otras cosas dentro del diseño principal. Y estos dos niños están realmente a un lado de los padres. – FoamyGuy

+1

Sí, tengo ancho. Tal vez podrías poner un diseño más con la alineación a la izquierda y derecha del primer diseño relativo (cuadrado azul) y luego poner el cuadrado rojo en el centro – Maxim

+0

Eso podría funcionar en realidad. Sé que para que la parte de Java de mi aplicación funcione como es ahora, necesito el diseño de la barra azul para permanecer dentro del elemento principal de diseño principal.Pero creo que no tendré que hacer ningún cambio si coloco solo el rojo dentro de un nuevo padre. – FoamyGuy

-3

Sólo hay que establecer de esta manera:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 


    <View 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/bottomHolder" 
     android:layout_alignParentTop="true" 
     android:layout_centerInParent = "true"/> 

    <View 
     android:id="@+id/bottomHolder" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true"/> 

</RelativeLayout> 
+1

Lea la pregunta: "Estos diseños de niños no están centrados en mi diseño principal". – Karu

1

La única solución que funcionó a yo era envolver ambos componentes en una FrameLayout con la dimensión de la pieza más grande y establecen el segundo componente en el centro de la FrameLayout utilizando la propiedad

<FrameLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 

    <ImageView 
     android:id="@+id/red_component" 
     android:layout_width="100dp" 
     android:layout_height="100dp"/> 

    <View 
     android:id="@+id/blue_component" 
     android:layout_width="30dp" 
     android:layout_height="30dp" 
     android:layout_gravity="center" /> 

</FrameLayout> 
0

Para textos que han estado utilizando este Fe para una alineación vertical-centro:

android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:gravity="center_vertical" 
android:layout_alignTop="@id/theBigOne" 
android:layout_alignBottom="@id/theBigOne" 
android:layout_toRightOf="@id/theBigOne" 
1

A veces puede establecer alignLeft y alignRight en la vista deseada y luego usar la gravedad en el elemento que desea centrar.

Por ejemplo:

android:layout_below="@+id/firstLayout" 
android:layout_alignLeft="@+id/firstLayout" 
android:layout_aligntRight="@+id/firstLayout" 
android:gravity="center" 

Si el componente no es un TextView (o una vista en la que no es necesario el fondo), a continuación, podría envolverlo en un FrameLayout con las propiedades anteriores.

<MyView id="@+id/firstLayout" .. other props/> 

<FrameLayout 
    ... other props 
    android:layout_below="@+id/firstLayout" 
    android:layout_alignLeft="@+id/firstLayout" 
    android:layout_aligntRight="@+id/firstLayout" 
    android:gravity="center" > 

    <MyView id="@+id/myAlignedView" ..other props /> 

</FrameLayout> 

De esta manera, la vista inferior será un marco con la misma anchura que la superior, pero por dentro habrá una vista que está centrada a la anchura.

Por supuesto, esto solo funciona cuando sabes cuál es la vista más grande. De lo contrario, como respondió Laranjeiro, envuelva ambos contenidos en otro diseño con gravedad centrada.

Cuestiones relacionadas