web-dev-qa-db-fra.com

Problème avec RelativeLayout lorsque la visibilité de View est View.GONE

J'ai une RelativeLayout ainsi:

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

Chaque TextView est ancrée sous la précédente TextView avec Android:layout_below.

Le problème est que TextView2 peut être ou ne pas être là (soit View.VISIBLE ou View.GONE); si c'est View.VISIBLE, alors tout va bien, mais si c'est View.GONE, alors TextView3 sera rendu au-dessus de TextView1.

J'ai essayé plusieurs façons de résoudre ce problème, mais chaque fois que je suis pris au piège par la règle RelativeLayout, vous ne pouvez pas référencer un identifiant avant qu'il ne soit défini.

J'espère qu'il me manque quelque chose d'évident ici. 

67
James

Vous pouvez placer textview 2 et 3 dans LinearLayout et conserver la disposition linéaire sous textview 1.

39
Karan

Vous pouvez utiliser cette balise:

Android:layout_alignWithParentIfMissing="true"

De la docs:

Si défini sur true, le parent sera utilisé comme ancre lorsque l'ancre est introuvable pour layout_toLeftOf, layout_toRightOf, etc.

170
ininprsr

pourquoi ne pas mettre à jour l'attribut below de TextView3 lorsque vous mettez à jour la visibilité de TextView2? (Je suppose que vous faites cela dans le code)

quelque chose comme

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

Oubliez INVISIBLE ou GONE, utilisez ceci à la place:

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

params.height = 0;

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

view.setLayoutParams(params);
6
user925799

Cette réponse ne résout pas votre problème spécifique, mais résout un problème similaire. J'espère donc que cela aidera quelqu'un.

J'ai eu une situation où ma mise en page relative n'avait pas l'équivalent de votre TextView1. Donc, dans ma situation, si TextView2 était GONE, je voulais que TextView3 soit aligné sur le haut du parent. J'ai résolu ce problème en ajoutant à TextView3 l'attribut Android: layout_alignWithParentIfMissing = "true". Voir http://developer.Android.com/resources/articles/layout-tricks-efficiency.html .

Malheureusement, je ne vois pas de moyen de spécifier une ancre d'alignement alternative à moins que ce ne soit le parent.

6
Samuel Yang

tu peux le faire 

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

laissez TextView3 sous ce FrameLayout qui n'a pas d'arrière-plan. Par conséquent, si TextView2 est Gone, il n'occupe pas d'espace.

1
Alittle927

placez toutes les vues textuelles sous LinearLayout avec une orientation verticale.

<LinearLayout>
<TextView/>
<TextView/>
<TextView/>
<TextView/>
<TextView/>
<TextView/>
</LinearLayout>
0
Ashwini