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í.


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.


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.


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);

¿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.


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);

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.


1

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

<LinearLayout>
<TextView/>
<TextView/>
<TextView/>
<TextView/>
<TextView/>
<TextView/>
</LinearLayout>

-3

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


Esto mantendrá el espacio innecesario ocupado.
Henrique Monte
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.