我可以在运行时以编程方式设置“ android:layout_below”吗?


Answers:


464

是:

RelativeLayout.LayoutParams params= new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT); 
params.addRule(RelativeLayout.BELOW, R.id.below_id);
viewToLayout.setLayoutParams(params);

首先,代码通过指定高度和宽度来创建新的布局参数。该addRule方法正确添加了xml的等效项android:layout_below。然后,您只需调用View#setLayoutParams要具有这些参数的视图。


11
为什么这个答案不能被接受?这是一个很好的解释。
Adithya

145

或者,您可以使用视图的当前布局参数并对其进行修改:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) viewToLayout.getLayoutParams();
params.addRule(RelativeLayout.BELOW, R.id.below_id);

14
@EelLee很显然,这是回答问题的另一种方式,这就是为什么它有11票赞成票。
Alex K

8
与其他答案相比,这应该有更多的支持:为了保持视图的一致行为,我们应该使用现有视图LayoutParams而不是创建新视图。实际上,这应该被接受为正确答案。
Alex Karshin '16

10

虽然@jackofallcode答案是正确的,但可以写成一行:

((RelativeLayout.LayoutParams) viewToLayout.getLayoutParams()).addRule(RelativeLayout.BELOW, R.id.below_id);

1
这不允许您实际更改布局,因为您需要引用LayoutParams来设置setLayoutParams
-Stef,

@Stef,我在一个项目中使用了此解决方案。虽然jackofallcode解决方案是唯一的解决方法,但我还是对其进行了简化。但是现在我认为缩短到一行是不好的,因为如果发生任何异常,将很难理解是什么操作员提出了这一要求。
CoolMind

1
@CoolMind我不太喜欢将代码缩短到1行,这使得它更难阅读,尤其是在涉及强制转换时。另外,按照我的方式做,您可以进行进一步的更改:)
jackofallcode

@jackofallcode,同意你的观点!目前,我也写了几行,因为当崩溃发生时,更容易理解在哪一行发生了错误。
CoolMind

1

具有infix功能的Kotlin版本

infix fun View.below(view: View) {
      (this.layoutParams as? RelativeLayout.LayoutParams)?.addRule(RelativeLayout.BELOW, view.id)
}

然后您可以编写:

view1 below view2

或者您可以将其称为普通函数:

view1.below(view2)
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.