android - layout_below - Problema con RelativeLayout cuando la visibilidad de la vista es View.GONE
relativelayout below (6)
¿Por qué no actualizar el atributo below
de TextView3 cuando actualiza la visibilidad de TextView2? (Supongo que haces esto en el código)
algo 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);
Tengo un RelativeLayout
así:
<RelativeLayout>
<TextView1/>
<TextView2/> // <-- View.VISIBLE OR View.GONE
<TextView3/>
<TextView4/>
</RelativeLayout>
Cada TextView
está anclado debajo de la vista de texto anterior con android:layout_below
.
El problema es que TextView2 puede estar o no allí (ya sea View.VISIBLE
o View.GONE
); si es View.VISIBLE
, todo está bien, pero si se trata de View.GONE
, TextView3 termina renderizado sobre TextView1.
He intentado varias formas de arreglar esto, pero cada vez estoy atrapado por RelativeLayout
"no se puede hacer referencia a una identificación antes de que se haya definido".
Espero que me esté perdiendo algo obvio aquí.
En caso de que no esté obligado a usar RelativeLayout
: use LinearLayout
en LinearLayout
lugar.
Esta respuesta no resuelve su problema específico, pero resuelve uno similar, así que con suerte esto ayudará a alguien.
Tuve una situación en la que mi diseño relativo 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 forma de especificar un ancla de alineación alternativa a menos que sea el padre.
Olvídate de INVISIBLE
o GONE
, utiliza esto en su lugar:
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) view.getLayoutParams();
params.height = 0;
params.setMargins(0,0,0,0);
view.setLayoutParams(params);
Puede colocar textview 2 y 3 en LinearLayout y mantener el diseño lineal debajo de textview 1.
Puedes usar esta etiqueta:
android:layout_alignWithParentIfMissing="true"
De los documentos:
Si se establece en verdadero, el padre se usará como ancla cuando no se pueda encontrar el anclaje para layout_toLeftOf, layout_toRightOf, etc.