约束布局中以编程方式添加的按钮将忽略约束 - Android
Posted
技术标签:
【中文标题】约束布局中以编程方式添加的按钮将忽略约束 - Android【英文标题】:Constraints are ignored for programmatically added buttons in the constraint layout - Android 【发布时间】:2021-12-22 08:50:32 【问题描述】:我正在创建一个基于 ConstraintLayout 的自定义布局,我想在其中使用 CircularPositioning 以编程方式在按钮 (Button Main) 周围填充多个按钮。在 xml 文件(Button XML)中使用 CircularPositioning 没有问题。但是,当我在布局的 init 块中以编程方式添加新按钮(Button Kotlin)时,使用 LayoutParams 添加的约束将被忽略,添加的按钮会跳转到左上角。
下面是我的布局代码:
class MyCustomLayout(context: Context, attrs: AttributeSet) : ConstraintLayout(context, attrs)
init
val layout = inflate(context, R.layout.circular_buttons, this) as ConstraintLayout
val buttonMain = findViewById<Button>(R.id.circular_buttons_button_main)
val newButton = Button(context)
newButton.id = View.generateViewId()
newButton.text = "Button Kotlin"
newButton.visibility = VISIBLE
val params =
LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,
).apply
circleConstraint = buttonMain.id
circleRadius = 100
circleAngle = 60f
newButton.layoutParams = params
layout.addView(newButton)
我也尝试使用 ConstraintSet 添加约束,但是结果是一样的。
val constraintSet = ConstraintSet()
constraintSet.clone(layout)
constraintSet.constrainCircle(newButton.id, buttonMain.id, 100, 60f)
constraintSet.constrainHeight(newButton.id, ConstraintSet.WRAP_CONTENT)
constraintSet.constrainWidth(newButton.id, ConstraintSet.WRAP_CONTENT)
constraintSet.applyTo(layout)
我做错了什么?
【问题讨论】:
你能添加布局xml的例子吗? 【参考方案1】:您正在将您的按钮添加到不同的父级。您的“布局”变量被引用到父视图。您想要添加按钮以成为此视图的子项的 ConstraintLayout。
你的层次结构是这样的:
<ConstraintLayout>
<ConstraintLayout>
<Button> --> Added from XML
<ConstraintLayout>
<Button> --> Added from code
</ConstraintLayout>
要解决这个问题,您需要参考 XML 中的约束布局并为其添加按钮。
例如:
val clMain = layout.findViewById<ConstraintLayout>(R.id.cl_main)
...
clMain.addView(newButton)
【讨论】:
成功了,谢谢!我不知道 inflate 函数根据提供的参数返回不同的根。以上是关于约束布局中以编程方式添加的按钮将忽略约束 - Android的主要内容,如果未能解决你的问题,请参考以下文章
iOS - 约束在 viewdidload 中以意想不到的方式动画?