我有RelativeLayout
因此:
<RelativeLayout>
<TextView1/>
<TextView2/> // <-- View.VISIBLE OR View.GONE
<TextView3/>
<TextView4/>
</RelativeLayout>
每个TextView
都锚定在之前的TextView
android:layout_below
之下。
问题是TextView2可能存在也可能不存在(View.VISIBLE
或View.GONE
);如果它是View.VISIBLE
,那么一切都很好,但如果它是View.GONE
,那么TextView3最终会在TextView1上呈现。
我已经尝试了各种方法来解决这个问题,但每次都被RelativeLayout
'抓住了'你就无法在定义'规则之前引用id。
我希望我在这里遗漏一些明显的东西。
答案 0 :(得分:177)
您可以使用此标记:
android:layout_alignWithParentIfMissing="true"
来自文档:
如果设置为true,则当无法找到layout_toLeftOf,layout_toRightOf等的锚点时,父项将用作锚点。
答案 1 :(得分:39)
您可以在LinearLayout中放置textview 2和3,并将线性布局保留在textview 1下面。
答案 2 :(得分:10)
为什么在更新TextView2的可见性时不更新TextView3的below
属性? (我假设您在代码中执行此操作)
类似
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);
答案 3 :(得分:6)
这个答案并没有解决你的具体问题,但确实解决了类似问题,所以希望这会对某人有所帮助。
我的情况是我的相对布局没有相当于你的TextView1。所以,在我的情况下,如果TextView2是GONE,那么我希望TextView3与父级的顶部对齐。我通过向TextView3添加属性android:layout_alignWithParentIfMissing =“true”解决了这个问题。请参阅http://developer.android.com/resources/articles/layout-tricks-efficiency.html。
不幸的是,我没有看到指定备用对齐锚的方法,除非它是父对象。
答案 4 :(得分:6)
忘记INVISIBLE
或GONE
,请改用:
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) view.getLayoutParams();
params.height = 0;
params.setMargins(0,0,0,0);
view.setLayoutParams(params);
答案 5 :(得分:2)
您可以做到
<RelativeLayout>
<TextView1/>
<FrameLayout>
<TextView2/> // <-- View.VISIBLE OR View.GONE
</FrameLayout>
<TextView3/>
<TextView4/>
</RelativeLayout>
在此TextLayout3下面的TextLayout3中使其不具有背景,因此如果TextView2为Gone,则不会占用空间。
答案 6 :(得分:-2)
一个简单的黑客就是使用alpha 0/1。 如果有任何
,也会禁用onClickListener