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

217

在运行时创建RelativeLayout时,是否可以以编程方式设置与android:layout_below相同的属性?

4个回答

484

可以:

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 方法。


13
为什么这个答案不能被采纳?它是一个非常好的解释。 - Adithya
对我来说可以运作。我使用这种方法在一个视图上方添加了一个视图。这个答案应该立即被接受。 - Rohit Singh

154

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

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

14
很明显,这是对问题的另一种回答方式,这也解释了为什么它得到了11个赞。 - Alex K
9
这个回答应该比另一个回答得到更多的赞同:为了保持视图的一致行为,我们应该使用现有的LayoutParams而不是创建新的。实际上,这应该被接受为正确答案。 - Kevin Kopf

13

虽然 @jackofallcode 的答案是正确的,但可以用一行代码来实现:

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

1
这不允许您实际更改布局,因为您需要对 "LayoutParams" 进行引用,并使用 "setLayoutParams" 设置它们。 - Stef
@Stef,我在一个项目中使用了这个解决方案。虽然jackofallcode的解决方案是唯一正确的,但我简化了它。但现在我认为缩短到一行不好,因为如果出现任何异常,就会更难理解是哪个运算符引发了它。 - CoolMind
1
@CoolMind,我不太喜欢将代码缩短到一行,这会使其更难阅读,特别是涉及类型转换时。而且按照我的方式编写代码可以让你进一步进行修改 :) - jackofallcode
@jackofallcode,我同意你的观点!目前我也会写成几行,因为当出现崩溃时,更容易理解错误发生在哪一行。 - CoolMind

5

Kotlin版本带有中缀函数

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

那么你可以写:

view1 below view2

或者你可以将其视为普通函数:

view1.below(view2)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接