2010-07-19 25 views
60

我有一个RelativeLayout这样的:问题与RelativeLayout的时候查看能见度View.GONE

<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'规则。

我希望我在这里失去一些明显的东西。

回答

35

你可以把TextView的2和3中的LinearLayout,并保持低于TextView的线性布局1.

+8

向布局文件添加层次结构总是一个坏主意,特别是如果它是RelativeLayout。您添加的越多,Android将创建对象来表示您的布局。您应该使用类似android:layout_alignWithParentIfMissing =“true”的东西。例如,您也可以考虑使用其他布局,如TableLayout。 – 2016-03-02 23:48:52

8

当您更新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); 
6

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

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

不幸的是,我没有看到一种方法来指定一个替代对齐锚点,除非它是父类。

4

忘记INVISIBLEGONE,改用此:

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

params.height = 0; 

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

view.setLayoutParams(params); 
140

您可以使用此标记:

android:layout_alignWithParentIfMissing="true" 

从文档:

如果设置为true,当无法找到layout_toLeftOf,layout_toRightOf等的锚点时,父级将用作锚点。

+12

这仅适用于需要与父级对齐的情况,但问题在于如何与先前的视图对齐,而不是父级。 – dimsuz 2015-06-01 13:15:21

1

如果您没有被迫使用RelativeLayout:请改为使用LinearLayout

+1

这不是很有用 - 有很多情况下实际需要使用RelativeLayout。 – chrisdowney 2017-03-01 20:11:29

+0

@chrisdowney我相信我的解决方案可能会有帮助。这是一个非常简单的修复,以防程序员可以灵活地更改布局类型。如果你不喜欢它,那么有5个其他解决方案发布到这个问题! – Behnam 2017-03-17 19:11:07