如何以编程方式在相对布局中设置按钮的layout_align_parent_right属性?


285

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

 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"属性?

Answers:


639

您可以使用来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

1
如果锚没有编号怎么办?params.addRule(RelativeLayout.LEFT_OF,R.id.id_to_be_left_of); TextView tvUserName = new TextView(act);
圣罗布森2014年

18
如何添加ID?
user2161301 2015年

1
如果button在上RecycleView怎么办?向相同的小部件添加相同或相反的规则不是问题吗?
亚诺斯

如果我更改对齐方式,它只会工作一次,不会更新。我可以知道是什么问题吗?
Shshank Bhong

我尝试使用它,但是在我的代码中变成红色了addRule

12
  1. 您需要为需要引用的按钮创建ID和ID: btn1.setId(1);
  2. 您可以使用params变量将参数添加到您的布局中,我认为方法是addRule(),查看此LayoutParams对象的android java文档 。

我将非常感谢任何一段代码。我在按钮中找不到任何方法。
Fahad Ali,

设置id并没有帮助,因为它期望一个真实的资源ID,而不仅仅是一个数字,因为setId用@IdRes注释。
谭凯文

那是新的东西,在过去,您可以从布局中获取一个资源编号,并将其用作不会冲突的资源ID的基础。我猜想Google必须阻止了它/
codeScriber15年

6

要添加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)


0

Kotlin版本:

将这些扩展与infix函数一起使用,可简化以后的调用

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
}

然后将它们用作infix函数调用:

view1 below view2
view1 leftOf view2
view1 alightParentRightIs true

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

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