约束布局中以编程方式添加的按钮将忽略约束 - 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 8 中以编程方式将视图中的按钮居中使用约束

如何在 ios 中以编程方式添加约束

iOS - 约束在 viewdidload 中以意想不到的方式动画?

如何在iOS中以编程方式从UIButton中删除等宽约束

如何在 ios swift 中以编程方式创建自动布局等宽约束?

有啥方法可以在 Swift 中以编程方式获取所有应用的自动布局约束