2012-02-19 48 views
9

Uso RelativeLayouts extensamente en mi aplicación y pensé que sabía cómo especificarlos, pero esto me tiene perdido. Básicamente estoy posicionando 4 TextViews en dos filas de dos, cada una de las cuales consiste en una etiqueta y un texto que se suministrarán. Debe ser algo como:Android layout_below no funciona

Nacido el 23 agosto 1810 Mason Co., Kentucky

Murió el 15 julio 1865 Cincinnati, Hamilton Co., Ohio

Ésta es la parte pertinente de la disposición:

 <TextView android:id="@+id/birth_lbl" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/given_layout" 
      android:layout_alignLeft="@+id/given_layout" 
      android:layout_marginTop="6dip" 
      style="@style/label" 
      android:text="@string/born" 
     /> 
     <TextView android:id="@+id/birth" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_toRightOf="@+id/birth_lbl" 
      android:layout_alignBaseline="@+id/birth_lbl" 
      android:layout_marginLeft="10dip" 
      android:layout_marginRight="6dip" 
      style="@style/main_text" 
      android:text="dd Mmm yy" 
     /> 
     <TextView android:id="@+id/death_lbl" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/birth" 
      android:layout_alignLeft="@+id/birth_lbl" 
      android:layout_marginTop="4dip" 
      style="@style/label" 
      android:text="@string/died" 
     /> 
     <TextView android:id="@+id/death" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_toRightOf="@+id/death_lbl" 
      android:layout_alignLeft="@+id/birth" 
      android:layout_alignBaseline="@+id/death_lbl" 
      android:layout_marginRight="6dip" 
      style="@style/main_text" 
      android:text="dd Mmm yy" 
     /> 

¡Por alguna razón, esto muestra las vistas de la línea de muerte SOBRE LAS vistas de la línea de nacimiento! Si cambio la especificación de la vista death_lbl para que en su lugar sea 'layout_below = "@ + id/birth_lbl"', ¡las líneas se posicionan correctamente! Sin embargo, es posible que la vista de "nacimiento" se ajuste a varias líneas, así que realmente necesito ubicar la 2da línea debajo de "nacimiento", no "nacimiento_lbl".

¿Alguien sabe el motivo de este comportamiento? Se produce tanto en el editor de diseño gráfico en Eclipse como en el tiempo de ejecución en mi tableta con Android 4.0.

+1

El signo '+' en la declaración 'id' debe usarse solo en la primera aparición del' id'. Debería editar y publicar el archivo de diseño completo para ver las vistas adicionales que usa ('given_layout'?).Lo probé en el emulador y para mi está funcionando, pero por supuesto no tengo la vista adicional 'given_layout'. – Luksprog

+0

Es porque, como dijo Slukian, ni siquiera sabes lo que estás haciendo ... Deja de usar el '+' donde quieras e intenta considerar que cada + que tienes es como crear una nueva variable ... Incluso es bonita Es extraño que el compilador no diga una palabra sobre eso ... – Cehm

+2

¡Más suavemente aquí! El compilador de Android 21 pone estas ventajas cuando usas el "diseño". La razón por la que hacemos preguntas es porque, como dices, no lo sabemos. – user462990

Respuesta

13

intente cambiar android:layout_below="@+id/birth" en death_lbl a android:layout_below="@id/birth", porque a estas alturas ya se declaró, que el + implica, podría dar lugar a problemas cuando se declara de nuevo.

+0

Gracias. De hecho, lo sabía y lo que viste en mi código de muestra fue algo que probé con desesperación :-). Lo volví a poner como estaba con el mismo resultado. – gordonwd

+0

pero cuando lo hago, no es trabajo y cuando lo pongo +, ¡es trabajo! ¿Por qué? –

0

Su problema es que llama a las propiedades en el diseño relativo como si lo estuviese declarando nuevamente.

Cuando se declara un ID de un punto de vista, entonces se debe hacer como esto android:id="@+id/button" y cuando que desea Android para posicionar ese punto de vista particular por encima o por debajo de cualquier otra vista en una disposición relativa que tiene que llamarlo como esto android:layout_below="@id/textview"

Esto le dice a Android que ha declarado un botón con el botón id y desea que se coloque debajo de la vista de texto, recuerde que no use @+id para ver la posición use @id.

+0

Ver mi comentario arriba. ¡Gracias! – gordonwd

+1

esto no es del todo correcto. si tiene una vista o un grupo de vistas declarados arriba de otro en el archivo xml pero desea usarlos como ejemplo en RightOf o toLeftOf, puede hacer referencia a la vista a continuación usando @ + id y luego usar @ + id nuevamente o @id al establecer el ID del view/viewgroup en sí. @ + id agregará la identificación a su R y luego se conectará a la vista que también se relaciona cuando se construye la aplicación. – speedynomads

+0

@ domji84 Usted está equivocado, no puede hacer referencia a las Vistas o, de hecho, a cualquier recurso mediante el uso de @ + id, su único propósito es crear un nuevo recurso. Consulte esta respuesta http://stackoverflow.com/a/5025971/892055 –

1

Si la fijación de sus + signos no ayuda, siempre se puede posicionar su id/death continuación id/birth y, a continuación, poner id/death_label toLeftOf id/death.

+0

Probé eso y simplemente no le gusta poner nada debajo de esa vista de identificación/nacimiento. Voy a intentar codificar un caso más aislado en un archivo separado antes de ir más allá con esto. ¡Gracias! – gordonwd

1

Pude duplicar este fenómeno al codificar temporalmente layout con solo esos campos, y pude determinar que el problema desaparecía si no colocaba la vista inicial birth_lbl en relación con la vista de arriba (" given_layout "en este caso).

Así que no estoy seguro de si esto está clasificado como una solución, una solución o un kludge (¿todavía es una palabra en estos días?), Pero lo que hice fue colocar las vistas de texto dentro de su propia RelativeLayout y coloque el RelativeLayout relativo a id/given_layout. En cualquier caso, funciona ...

2

también estaba enfrentando el mismo problema porque estaba usando diseño de la fuerza, sino align_below sólo funciona en de disposición relativa. así que verifique qué diseño está usando.