View可见性为View.GONE时,RelativeLayout出现问题

时间:2010-07-19 07:15:54

标签: android android-relativelayout

我有RelativeLayout因此:

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

每个TextView都锚定在之前的TextView android:layout_below之下。

问题是TextView2可能存在也可能不存在(View.VISIBLEView.GONE);如果它是View.VISIBLE,那么一切都很好,但如果它是View.GONE,那么TextView3最终会在TextView1上呈现。

我已经尝试了各种方法来解决这个问题,但每次都被RelativeLayout'抓住了'你就无法在定义'规则之前引用id。

我希望我在这里遗漏一些明显的东西。

7 个答案:

答案 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)

忘记INVISIBLEGONE,请改用:

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