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.
Vous pouvez placer textview 2 et 3 dans LinearLayout et conserver la disposition linéaire sous textview 1.
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.
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);
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);
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.
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.
placez toutes les vues textuelles sous LinearLayout avec une orientation verticale.
<LinearLayout>
<TextView/>
<TextView/>
<TextView/>
<TextView/>
<TextView/>
<TextView/>
</LinearLayout>