2010-07-19 19 views
60

Tengo un RelativeLayout así:Problema con RelativeLayout cuando la visibilidad es View.GONE Ver

<RelativeLayout> 
<TextView1/> 
<TextView2/> // <-- View.VISIBLE OR View.GONE 
<TextView3/> 
<TextView4/> 
</RelativeLayout> 

Cada TextView está anclado por debajo de la anterior TextView con android:layout_below.

El problema es que TextView2 puede o no estar allí (ya sea View.VISIBLE o View.GONE); si es View.VISIBLE, todo está bien, pero si es View.GONE, TextView3 termina renderizado encima de TextView1.

He intentado varias formas de solucionar esto, pero cada vez que estoy atrapado por RelativeLayout "no se puede hacer referencia a una identificación antes de que esté definida" regla.

Espero que me esté perdiendo algo obvio aquí.

Respuesta

35

Puede colocar TextView 2 y 3 en el LinearLayout y tener la disposición lineal por debajo de Vista de Texto 1.

+8

Agregar jerarquía a un archivo de diseño siempre es una mala idea, especialmente si se trata de un RelativeLayout. Cuanto más agregue, más Android creará Objetos para representar su diseño. Debería usar algo como android: layout_alignWithParentIfMissing = "true" en su lugar. También podría considerar usar otros diseños como TableLayout, por ejemplo. –

8

¿por qué no actualizar el atributo below de TextView3 cuando actualiza la visibilidad de TextView2? (Supongo que lo hace en el código)

algo así como

TextView tv = (TextView) findViewById(R.id.textview3); 
RelativeLayout.LayoutParams lp = 
    (RelativeLayout.LayoutParams) tv.getLayoutParams(); 
lp.addRule(RelativeLayout.BELOW, R.id.textview1); 
((TextView) view).setLayoutParams(lp); 
6

Esta respuesta no resuelve su problema específico, pero resuelve uno similar, así que con suerte esto ayudará a alguien.

Tuve una situación donde mi disposición relativa no tenía el equivalente de su TextView1. Entonces, en mi situación, si TextView2 se GONE, entonces quería que TextView3 se alineara con la parte superior de los padres. Lo resolví agregando a TextView3 el atributo android: layout_alignWithParentIfMissing = "true". Ver http://developer.android.com/resources/articles/layout-tricks-efficiency.html.

Desafortunadamente, no veo una manera de especificar un ancla de alineación alternativa a menos que sea el principal.

4

Olvídate de INVISIBLE o GONE, utilizar esto en su lugar:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) view.getLayoutParams(); 

params.height = 0; 

params.setMargins(0,0,0,0); 

view.setLayoutParams(params); 
140

Se puede usar esta etiqueta:

android:layout_alignWithParentIfMissing="true" 

A partir de los documentos:

Si es verdadero, la parent se usará como ancla cuando no se pueda encontrar el anclaje para layout_toLeftOf, layout_toRightOf, etc.

+12

Esto funciona solo cuando se desea la alineación con el elemento primario, pero la pregunta era cómo alinearse con la vista anterior, no con el elemento principal. – dimsuz

1

En caso de que no esté obligado a utilizar RelativeLayout: Use LinearLayout en su lugar.

+1

Esto no es realmente útil; hay muchas situaciones en las que RelativeLayout es realmente necesario. – chrisdowney

+0

@chrisdowney Creo que mi solución puede ser útil. Es una solución muy simple en caso de que el programador tenga la flexibilidad de cambiar el tipo de diseño. Si no te gusta, entonces hay otras 5 soluciones publicadas en esta pregunta. – Behnam

Cuestiones relacionadas