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

Posted

技术标签:

【中文标题】如何以编程方式设置相对布局中按钮的 layout_align_parent_right 属性?【英文标题】:How to programmatically set the layout_align_parent_right attribute of a Button in Relative Layout? 【发布时间】:2011-06-06 01:07:31 【问题描述】:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

您可以使用View.getLayoutParams 从代码中访问任何LayoutParams。您只需要非常清楚您访问的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

【讨论】:

如果主播没有id怎么办? params.addRule(RelativeLayout.LEFT_OF, R.id.id_to_be_left_of);TextView tvUserName = new TextView(act); 添加ID怎么样? 如果buttonRecycleView 上怎么办?向同一个小部件添加相同或相反的规则不是问题吗? 它只工作一次,如果我改变对齐它不会得到更新。我可以知道可能是什么问题吗?? 我尝试使用它,但它在addRule 的代码中变为红色?【参考方案2】:
    您需要为 您需要参考的按钮: btn1.setId(1); 您可以使用 params 变量来 将参数添加到您的布局中,我 认为方法是addRule(),检查 为此的 android java 文档 LayoutParams 对象。

【讨论】:

我非常感谢任何一段代码。我在按钮中找不到任何方法。 设置 id 没有帮助,因为它需要一个真实的资源 id 而不是一个数字,因为 setId 是用 @IdRes 注释的。 那是新的,在过去,您可以从布局中获取资源编号,并将其用作不会发生冲突的资源 id 的基础。我猜谷歌一定已经阻止了/【参考方案3】:

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

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) 的快捷方式。

【讨论】:

【参考方案4】:

Kotlin 版本:

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

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)

【讨论】:

以上是关于如何以编程方式设置相对布局中按钮的 layout_align_parent_right 属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式在约束布局中添加视图?

Android以编程方式设置在xml文件中声明的按钮边距? [复制]

以编程方式创建相对布局

Android相对布局与按钮宽度使用权重

在其线性布局垂直父Android中将以编程方式创建的单选按钮居中

如何以编程方式设置 layout_gravity?