MATCH_CONSTRAINTS 不适用于动态生成的加权链

MATCH_CONSTRAINTS not working in dynamically generated weighted chain

我写了下面的方法。它动态创建 16 个红色视图框,然后将它们添加到约束布局链中,以便在父布局中水平分布它们。它有效,但前提是我给视图一个特定的宽度值,并且我希望它们填充可用的 space。如果我将每个视图的宽度设置为 ConstraintSet.MATCH_CONSTRAINT,其中 none 个会出现。

我做错了什么?我认为如果将宽度设置为 MATCH_CONSTRAINT,每个视图将填满按其权重值分配给它的 space。相反,它们根本没有出现,只有在我给它们指定宽度时它们才会出现,但它们不会增大或缩小以适应视图。就好像将它们设置为 MATCH_CONSTRAINT 与将宽度字面上设置为零一样。

private fun createDropTargets(parentView: ConstraintLayout) {
        parentView.setOnDragListener(StaffDragListener())
        val set = ConstraintSet()

        val ids = arrayListOf<Int>()
        val weights = arrayListOf<Float>()
        for (i in 0..15) {
            val drop = View(activity)
            drop.setBackgroundColor(Color.RED)

            // THE NEXT LINE IS WHERE I SET THE WIDTH VALUE. IF I SET TO A NUMBER > 0 THE VIEWS SHOW UP, BUT DO NOT DYNAMICALLY FILL THE SPACE
            
            val params = ConstraintLayout.LayoutParams(ConstraintSet.MATCH_CONSTRAINT, 0)
            params.setMargins(5, 0, 5, 0)
            drop.layoutParams = params
            drop.id = View.generateViewId()
            parentView.addView(drop)
            ids.add(drop.id)
            weights.add(1f)
        }
        set.clone(parentView)
        var previousId: Int? = null
        for ((index, id) in ids.withIndex()) {
            if (previousId == null) {
                set.connect(id, ConstraintSet.LEFT, ConstraintSet.PARENT_ID, ConstraintSet.LEFT)
            } else {
                set.connect(id, ConstraintSet.LEFT, previousId, ConstraintSet.RIGHT)
                if (index == ids.size - 1) {
                    set.connect(id, ConstraintSet.RIGHT, ConstraintSet.PARENT_ID, ConstraintSet.RIGHT)
                }
            }
            previousId = id
        }
        set.createHorizontalChain(ConstraintSet.PARENT_ID, ConstraintSet.LEFT, ConstraintSet.PARENT_ID, ConstraintSet.RIGHT, ids.toIntArray(), weights.toFloatArray(), ConstraintSet.CHAIN_SPREAD_INSIDE)
        set.applyTo(parentView)
    }

MATCH_CONSTRAINT 将 width/height 设置为零,因为它在 ConstraintSet:

中定义如下
public static final int MATCH_CONSTRAINT = 0;

这意味着约束将定义大小。没有约束或不正确的约束只会导致零 width/height.

除了高度设置为 MATCH_CONSTRAINT(记住 0 == MATCH_CONSTRAINT)之外,您的代码是正确的,但是您没有对高度应用约束,因此视图消失了(宽度但没有高度。)如果您为视图提供设置的高度,它们将会出现。以下代码将显示高度为 100px 的视图:

private fun createDropTargets(parentView: ConstraintLayout) {
    parentView.setOnDragListener(StaffDragListener())
    val set = ConstraintSet()

    val ids = arrayListOf<Int>()
    val weights = arrayListOf<Float>()
    for (i in 0..15) {
        val drop = View(activity)
        drop.setBackgroundColor(Color.RED)
        val params = ConstraintLayout.LayoutParams(ConstraintSet.MATCH_CONSTRAINT, 100)
        params.setMargins(5, 0, 5, 0)
        drop.layoutParams = params
        drop.id = View.generateViewId()
        parentView.addView(drop)
        ids.add(drop.id)
        weights.add(1f)
    }
    set.clone(parentView)
    set.createHorizontalChain(ConstraintSet.PARENT_ID, ConstraintSet.LEFT, ConstraintSet.PARENT_ID, ConstraintSet.RIGHT, ids.toIntArray(), weights.toFloatArray(), ConstraintSet.CHAIN_SPREAD_INSIDE)
    set.applyTo(parentView)
}

顺便说一句,第二个循环是多余的。所有这些工作都是通过创建链来完成的。

您必须决定是要定义高度,还是让高度由应用在 垂直 方向的适当约束来设置。