对于约束布局中以编程方式添加的按钮,约束将被忽略 - Android

Constraints are ignored for programmatically added buttons in the constraint layout - Android

我正在创建一个基于 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)

我做错了什么?

您正在将您的按钮添加到其他父级。您的 'layout' 变量引用了父视图。您要添加按钮的 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)