85

我有一个RelativeLayout这样的:

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

每个都用TextView锚定在前一个下方。TextViewandroid:layout_below

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

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

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

4

8 回答 8

217

你可以使用这个标签:

android:layout_alignWithParentIfMissing="true"

从文档:

如果设置为 true,则当 layout_toLeftOf、layout_toRightOf 等找不到锚点时,将使用父级作为锚点。

于 2012-02-15T04:04:37.260 回答
44

您可以将 textview 2 和 3 放在 LinearLayout 中,并将线性布局保持在 textview 1 下方。

于 2010-07-19T07:47:30.007 回答
12

为什么更新belowTextView2的可见性时不更新TextView3的属性?(我假设您在代码中执行此操作)

就像是

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);
于 2010-07-19T07:23:05.493 回答
8

这个答案不能解决你的具体问题,但确实解决了一个类似的问题,所以希望这会对某人有所帮助。

我有一种情况,我的相对布局没有你的 TextView1 的等价物。因此,在我的情况下,如果 TextView2 已消失,那么我希望 TextView3 与父级的顶部对齐。我通过向 TextView3 添加属性 android:layout_alignWithParentIfMissing="true" 解决了这个问题。请参阅http://developer.android.com/resources/articles/layout-tricks-efficiency.html

不幸的是,除非它是父节点,否则我看不到指定备用对齐锚点的方法。

于 2011-07-14T21:59:03.783 回答
7

忘记INVISIBLEor GONE,改用这个:

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

params.height = 0;

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

view.setLayoutParams(params);
于 2011-09-02T18:14:35.063 回答
5

你可以这样做

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

让 TextView3 在这个没有背景的 FrameLayout 下面,所以如果 TextView2 是 Gone ,它不会占用空间。

于 2018-09-07T06:35:34.593 回答
1

将所有 textViews 放置在具有垂直方向的 LinearLayout 下。

<LinearLayout>
<TextView/>
<TextView/>
<TextView/>
<TextView/>
<TextView/>
<TextView/>
</LinearLayout>
于 2018-09-13T12:43:50.630 回答
-3

一个简单的技巧是使用 alpha 0/1。如果有的话,也禁用 onClickListener

于 2018-06-03T16:44:45.457 回答