296

我有一个以编程方式创建的相对布局:

 RelativeLayout layout = new RelativeLayout( this );
    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,
            LayoutParams.WRAP_CONTENT);

现在我有两个按钮,我想在这个相对布局中添加它们。但问题是两个按钮都显示在 RelatiiveLayout 的左侧,彼此重叠。

buttonContainer.addView(btn1);
buttonContainer.addView(btn2);

现在我想知道如何像在 xml 中那样以编程方式设置按钮的android:layout_alignParentRight="true“或 属性”?android:layout_toLeftOf="@id/btn"

4

4 回答 4

660

您可以LayoutParams使用View.getLayoutParams. 您只需要非常清楚LayoutParams您的访问权限。这通常是通过检查包含ViewGroup是否有一个LayoutParams内部子级来实现的,那么这就是你应该使用的那个。在你的情况下,它是RelativeLayout.LayoutParams. 您将使用RelativeLayout.LayoutParams#addRule(int verb)RelativeLayout.LayoutParams#addRule(int verb, int anchor)

您可以通过代码访问它:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)button.getLayoutParams();
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
params.addRule(RelativeLayout.LEFT_OF, R.id.id_to_be_left_of);

button.setLayoutParams(params); //causes layout update
于 2011-01-09T12:04:40.903 回答
13
  1. 您需要为需要引用的按钮创建和标识: btn1.setId(1);
  2. 您可以使用 params 变量将参数添加到您的布局中,我认为方法是addRule(),请查看该 LayoutParams对象的 android java 文档。
于 2011-01-09T11:27:21.630 回答
13

要添加RelativeLayout值为 true 或 false 的属性,请使用0false 和RelativeLayout.TRUEtrue:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) button.getLayoutParams()
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE)

不管是否已经添加了该属性,您仍然可以使用addRule(verb, subject)它来启用/禁用它。但是,您可以使用后 API 17,removeRule(verb)这只是addRule(verb, 0).

于 2018-06-10T05:43:42.623 回答
2

科特林版本:

将这些扩展与简化后续调用的中缀函数一起使用

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

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

infix fun View.alightParentRightIs(aligned: Boolean) {
    val layoutParams = this.layoutParams as? RelativeLayout.LayoutParams
    if (aligned) {
        (this.layoutParams as? RelativeLayout.LayoutParams)?.addRule(RelativeLayout.ALIGN_PARENT_RIGHT)
    } else {
        (this.layoutParams as? RelativeLayout.LayoutParams)?.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, 0)
    }
    this.layoutParams = layoutParams
}

然后将它们用作中缀函数调用:

view1 below view2
view1 leftOf view2
view1 alightParentRightIs true

或者您可以将它们用作正常功能:

view1.below(view2)
view1.leftOf(view2)
view1.alightParentRightIs(true)
于 2020-04-28T21:36:27.810 回答