视图可见性为 View.GONE 时 RelativeLayout 问题

我的 RelativeLayout是这样的:

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

每个 TextViewandroid:layout_below锚定在前一个 TextView之下。

问题在于 TextView2可能存在,也可能不存在(无论是 View.VISIBLE还是 View.GONE) ; 如果是 View.VISIBLE,那么一切都没问题,但如果是 View.GONE,那么 TextView3最终会在 TextView1之上呈现。

我已经尝试了各种方法来解决这个问题,但每次都被 RelativeLayout的“在定义 id 之前不能引用它”规则所困扰。

我希望我漏掉了什么明显的东西。

31497 次浏览

why not update the below attribute of TextView3 when you update the visibility of TextView2? (I assume you do this in code)

something like

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

You can place textview 2 and 3 in the LinearLayout and keep the linear layout below textview 1.

This answer does not solve your specific problem, but does solve a similar one, so hopefully this will help somebody.

I had a situation where my relative layout did not have the equivalent of your TextView1. So, in my situation, if TextView2 was GONE, then I wanted TextView3 to be aligned with the parent's top. I solved that by adding to TextView3 the attribute android:layout_alignWithParentIfMissing="true". See http://developer.android.com/resources/articles/layout-tricks-efficiency.html.

Unfortunately, I do not see a way to specify an alternate alignment anchor unless it is the parent.

Forget about INVISIBLE or GONE, use this instead:

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


params.height = 0;


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


view.setLayoutParams(params);

You can use this tag:

android:layout_alignWithParentIfMissing="true"

From the docs:

If set to true, the parent will be used as the anchor when the anchor cannot be be found for layout_toLeftOf, layout_toRightOf, etc.

A simple hack for this is to play with alpha 0/1. and also disable the onClickListener if there is any

you can do this

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

let TextView3 below this FrameLayout which has no background, so if TextView2 is Gone ,it doesn't occupy space.

place all textViews under LinearLayout with vertical orientation.

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

Use ConstraintLayout, it doesn't break if a referenced view becomes GONE, instead it works as if the size of the hidden view became zero.

https://developer.android.com/reference/androidx/constraintlayout/widget/ConstraintLayout#VisibilityBehavior