尽管设置了尺寸,ConstraintLayout 中的自定义视图最终尺寸为 0

Despite setting dimensions, custom view in ConstraintLayout ends up with size 0

我有一个自定义视图 class (EmptyTableView),它通常工作正常。然而,在我将此视图置于 ConstraintLayout 中心的程序中的某个时刻,该视图突然变得不可见。进一步调查显示,视图定位在 (0, 0),大小为 (0 x 0)
我的 onMeasure() 里面的 measureSpecsEXACTLY 0。我不知道那是什么意思,但 someone 说当你弄乱测量模式时会发生这种情况,尽管我不知道为什么会发生这种情况。 这是源代码。

在我的应用程序中,我有一个名为 root 的 ConstraintLayout 视图,它的位置可以通过 DragAndDrop 程序更改。
我的计划是让视图对所有 4 个边都有约束,同时通过约束的偏差来控制位置。当我开始拖动视图时,左右约束被删除,位置由 setX()setY() 控制。这是用这种方法完成的(Kotlin):

fun ConstraintSet.prepareConstraintsForDrag(table: View) {
        clear(table.id)
        connect(table.id, ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START, table.left)
        connect(table.id, ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP, table.top)
    }

然后,当我结束 DragAndDrop 时,我从拖放回调中调用以下代码,以便将视图布局移动到 x 和 y,然后调用 restoreBiases() 连接所有 4 个双方再次:

DragEvent.ACTION_DRAG_ENDED -> {
                    shadowTouchPoint = null // Just an intern indicator for the drag
                    val draggedView = event.localState as View
                    with(draggedView) {
                        visibility = View.VISIBLE

                        rootConstraints.clone(root)
                        setMargin(id, ConstraintSet.START, x.toInt())
                        setMargin(id, ConstraintSet.TOP, y.toInt())
                        rootConstraints.applyTo(root)

                        translationX = 0f
                        translationY = 0f
                    }
                    rootConstraints.clone(root)
                    rootConstraints.restoreBiases(draggedView, options_guide, root.height.toFloat())
                    rootConstraints.applyTo(root)
                }

restoreBiases():

fun ConstraintSet.restoreBiases(table: View, sideGuide: Guideline, height: Float) {
        val xBias = table.x / (sideGuide.left - table.width).toFloat()
        val yBias = table.y / (height - table.height)

        center(table.id, ConstraintSet.PARENT_ID, ConstraintSet.START, 0,
                sideGuide.id, ConstraintSet.START, 0, xBias)
        center(table.id, ConstraintSet.PARENT_ID, ConstraintSet.TOP, 0,
                ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM, 0, yBias)
    }

完整代码在GitHubprepareConstraintsForDrag()prepareBiases() 位于 TableScene.kttablePlan目录下tabblePlan/ConstructEmptyTablePlan.ktEmptyTableView.kt中的回调。

这是 activity 内部的大致样子:

升级到 ConstraintLayout 的 1.1.2 版本:

implementation 'com.android.support.constraint:constraint-layout:1.1.2'

我认为 center() 在此版本之前可能存在问题。我认为这不会解决您的问题,但它可能会为找到根本问题扫清道路。换句话说,我认为您会在屏幕上看到不同的东西。

我可以说您的准则 options_guide 不知何故设置为屏幕宽度。也许这是意图,但如果不是,我会研究如何设置和使用该指南。