Android记录--约束布局动态添加View的小坑

424 阅读1分钟

约束布局动态添加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