约束布局动态添加view
有问题的方式:
var constraintSet = ConstraintSet().apply {
clone(binding.constraintLayout)
}
var button = Button(this).apply {
id = View.generateViewId()
text = "button"
}
binding.constraintLayout.addView(button)
constraintSet.connect(button.id, ConstraintSet.LEFT, ConstraintSet.PARENT_ID, ConstraintSet.LEFT)
constraintSet.connect(button.id, ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP)
constraintSet.connect(button.id, ConstraintSet.RIGHT, ConstraintSet.PARENT_ID, ConstraintSet.RIGHT)
constraintSet.connect(button.id, ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM)
constraintSet.applyTo(binding.constraintLayout)
这样添加的结果是,我的约束布局的背景不会显示
更改代码顺序,先添加view,再获取constraintSet,进行设置。就是想要的效果
var button = Button(this).apply {
id = View.generateViewId()
text = "button"
}
binding.constraintLayout.addView(button)
var constraintSet = ConstraintSet().apply {
clone(binding.constraintLayout)
}
constraintSet.connect(button.id, ConstraintSet.LEFT, ConstraintSet.PARENT_ID, ConstraintSet.LEFT)
constraintSet.connect(button.id, ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP)
constraintSet.connect(button.id, ConstraintSet.RIGHT, ConstraintSet.PARENT_ID, ConstraintSet.RIGHT)
constraintSet.connect(button.id, ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM)
constraintSet.applyTo(binding.constraintLayout)
原因是
var constraintSet = ConstraintSet().apply {
clone(binding.constraintLayout)
}
这段代码的执行时机不对。
从代码的意图,我们知道,constraintSet是从当前约束布局中clone出来的。如果过早的克隆,那么克隆出的布局中没有动态添加的组件,就会出现问题。【暂时这么理解】。
所以,要在动态添加组件完成后,再clone