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


82

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之前不能引用它”规则所困扰。

我希望这里缺少明显的东西。


RelativeLayout具有用于查找最接近的非GONE锚视图的嵌入式机制。我检查了姜饼,即使在那儿也存在:github.com/aosp-mirror/platform_frameworks_base/blob/…–
Miha_x64

Answers:


44

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


14
将层次结构添加到布局文件始终是个坏主意,特别是如果它是RelativeLayout。您添加的越多,Android将创建代表您的布局的对象。您应该使用类似android:layout_alignWithParentIfMissing =“ true”的名称。您可能还考虑使用其他布局,例如TableLayout。
弗朗索瓦·德穆

201

您可以使用以下标签:

android:layout_alignWithParentIfMissing="true"

从文档:

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


24
这仅在需要与父视图对齐时才有效,但问题是关于如何与以前的视图而不是父视图对齐。
dimsuz 2015年

@dismuz,这对于管理动态布局非常有用,并且可以避免在无法预料的情况下出现任何意外情况。
ininprsr

11

为什么不更新 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);

什么是“视图”?您可以更新代码吗?
CDrosos

8

这个答案不能解决您的特定问题,但是可以解决类似的问题,因此希望对您有所帮助。

我遇到的情况是我的相对布局没有您的TextView1的等效布局。因此,在我的情况下,如果TextView2消失了,那么我希望TextView3与父级的顶部对齐。我通过将属性android:layout_alignWithParentIfMissing =“ true”添加到TextView3中来解决了这一问题。参见http://developer.android.com/resources/articles/layout-tricks-efficiency.html

不幸的是,除非它是父级,否则我看不到指定替代对齐锚的方法。


7

忘记INVISIBLEGONE,请改用此:

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

params.height = 0;

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

view.setLayoutParams(params);

4

你可以这样做

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

让TextView3在没有背景的此FrameLayout下面,因此如果TextView2为Gone,则不会占用空间。


1

将所有textViews垂直放置在LinearLayout下。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.