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

Jam*_*mes 74 android android-relativelayout

我有一个RelativeLayout:

<RelativeLayout>
<TextView1/>
<TextView2/> // <-- View.VISIBLE OR View.GONE
<TextView3/>
<TextView4/>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

每个TextView锚定跌破前期TextViewandroid:layout_below.

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

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

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

ini*_*rsr 185

你可以使用这个标签:

android:layout_alignWithParentIfMissing="true"
Run Code Online (Sandbox Code Playgroud)

来自文档:

如果设置为true,则在无法找到layout_toLeftOf,layout_toRightOf等的锚点时,父项将用作锚点.

  • 这仅在需要与父对齐时才有效,但问题是如何与先前视图对齐,而不是与父对齐. (21认同)

Kar*_*ran 40

您可以在LinearLayout中放置textview 2和3,并将线性布局保留在textview 1下面.

  • 将层次结构添加到布局文件总是一个坏主意,特别是如果它是RelativeLayout.您添加的越多,Android将创建对象来表示您的布局.你应该使用像android这样的东西:layout_alignWithParentIfMissing ="true".您也可以考虑使用其他布局,例如TableLayout. (14认同)

slu*_*lup 10

更新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);
Run Code Online (Sandbox Code Playgroud)


Sam*_*ang 7

这个答案并没有解决你的具体问题,但确实解决了类似的问题,所以希望这对某些人有帮助.

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

不幸的是,我没有看到指定备用对齐锚的方法,除非它是父对象.


Ali*_*927 7

你可以这样做

<RelativeLayout>
<TextView1/>
<FrameLayout>
  <TextView2/>  // <-- View.VISIBLE OR View.GONE
</FrameLayout>
<TextView3/>
<TextView4/>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

让TextView3在这个没有背景的FrameLayout下面,这样如果TextView2消失了,它不占用空间。


小智 6

忘了INVISIBLE或者GONE,使用它代替:

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

params.height = 0;

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

view.setLayoutParams(params);
Run Code Online (Sandbox Code Playgroud)