Tengo un RelativeLayout
así:
<RelativeLayout>
<TextView1/>
<TextView2/> // <-- View.VISIBLE OR View.GONE
<TextView3/>
<TextView4/>
</RelativeLayout>
Cada uno TextView
está anclado debajo del anterior TextView
con android:layout_below
.
El problema es que TextView2 puede o no estar allí ( View.VISIBLE
o no View.GONE
); si es así View.VISIBLE
, entonces todo está bien, pero si es así View.GONE
, entonces TextView3 termina siendo renderizado sobre TextView1.
He intentado varias formas de solucionar este problema, pero cada vez que me atrapan RelativeLayout
's' no se puede hacer referencia a una identificación antes de que se defina la regla.
Espero estar perdiendo algo obvio aquí.
RelativeLayout
tiene un mecanismo integrado para encontrar la vista de ancla no GONE más cercana. ReviséRespuestas:
Puede colocar la vista de texto 2 y 3 en LinearLayout y mantener el diseño lineal debajo de la vista de texto 1.
fuente
Puedes usar esta etiqueta:
android:layout_alignWithParentIfMissing="true"
De los documentos:
fuente
¿Por qué no actualizar el
below
atributo de TextView3 cuando actualiza la visibilidad de TextView2? (Supongo que haces esto en código)algo como
fuente
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 desapareció, entonces quería que TextView3 estuviera alineado con la parte superior de los padres. Resolví eso 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.
fuente
Olvídate de
INVISIBLE
oGONE
usa esto en su lugar:RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) view.getLayoutParams(); params.height = 0; params.setMargins(0,0,0,0); view.setLayoutParams(params);
fuente
Puedes hacerlo
<RelativeLayout> <TextView1/> <FrameLayout> <TextView2/> // <-- View.VISIBLE OR View.GONE </FrameLayout> <TextView3/> <TextView4/> </RelativeLayout>
deje TextView3 debajo de este FrameLayout que no tiene fondo, por lo que si TextView2 se ha ido, no ocupa espacio.
fuente
coloque todos los textViews en LinearLayout con orientación vertical.
<LinearLayout> <TextView/> <TextView/> <TextView/> <TextView/> <TextView/> <TextView/> </LinearLayout>
fuente
Un truco simple para esto es jugar con alpha 0/1. y también deshabilite el onClickListener si hay alguno
fuente