如何以编程方式设置相对布局中按钮的 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怎么样? 如果button
在RecycleView
上怎么办?向同一个小部件添加相同或相反的规则不是问题吗?
它只工作一次,如果我改变对齐它不会得到更新。我可以知道可能是什么问题吗??
我尝试使用它,但它在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文件中声明的按钮边距? [复制]