对于约束布局中以编程方式添加的按钮,约束将被忽略 - 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)
我正在创建一个基于 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)