Problema con RelativeLayout cuando la visibilidad de la vista es View.GONE

82

Tengo un RelativeLayoutasí:

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

Cada uno TextViewestá anclado debajo del anterior TextViewcon android:layout_below.

El problema es que TextView2 puede o no estar allí ( View.VISIBLEo 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í.

James
fuente
RelativeLayouttiene un mecanismo integrado para encontrar la vista de ancla no GONE más cercana. Revisé
Miha_x64

Respuestas:

44

Puede colocar la vista de texto 2 y 3 en LinearLayout y mantener el diseño lineal debajo de la vista de texto 1.

Karan
fuente
14
Agregar jerarquía a un archivo de diseño siempre es una mala idea, especialmente si es 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 puede considerar usar otros diseños como TableLayout, por ejemplo.
Francois Dermu
201

Puedes usar esta etiqueta:

android:layout_alignWithParentIfMissing="true"

De los documentos:

Si se establece en verdadero, el padre se utilizará como ancla cuando no se pueda encontrar el ancla para layout_toLeftOf, layout_toRightOf, etc.

ininprsr
fuente
24
Esto funciona solo cuando se desea la alineación con el padre, pero la pregunta era cómo alinearse con la vista anterior, no con el padre.
Dimsuz
@dismuz, esto será muy útil en la gestión de diseños dinámicos y evita sorpresas en casos de esquina imprevistos.
ininprsr
11

¿Por qué no actualizar el belowatributo de TextView3 cuando actualiza la visibilidad de TextView2? (Supongo que haces esto en 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);
error
fuente
¿Qué es la "vista"? ¿puedes actualizar tu código?
CDrosos
8

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.

Samuel Yang
fuente
7

Olvídate de INVISIBLEo GONEusa esto en su lugar:

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

params.height = 0;

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

view.setLayoutParams(params);
usuario925799
fuente
4

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.

Un poco927
fuente
1

coloque todos los textViews en LinearLayout con orientación vertical.

<LinearLayout>
<TextView/>
<TextView/>
<TextView/>
<TextView/>
<TextView/>
<TextView/>
</LinearLayout>
Ashwini
fuente
-3

Un truco simple para esto es jugar con alpha 0/1. y también deshabilite el onClickListener si hay alguno

Taldroid
fuente
Esto mantendrá el espacio innecesario ocupado.
Henrique Monte