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

Android 尽管设置了尺寸,ConstraintLayout中的自定义视图最终的大小为0,android,android-constraintlayout,Android,Android Constraintlayout,我有一个自定义视图类(EmptyTableView),它通常工作正常。但是,在程序中的某个点上,我将此视图置于约束视图的中心位置,该视图突然变得不可见。进一步的研究表明,视图的位置为(0,0),大小为(0 x 0) myonMeasure()中的measureSpecs正好是0。我不知道这意味着什么,但我说当你弄乱测量模式时会发生这种情况,虽然我不知道为什么会发生在我看来。 这是源代码 在我的应用程序中,我有一个名为root的ConstraintLayout视图,它的位置可以通过DragAndD

我有一个自定义视图类(
EmptyTableView
),它通常工作正常。但是,在程序中的某个点上,我将此视图置于
约束视图的中心位置,该视图突然变得不可见。进一步的研究表明,视图的位置为
(0,0)
,大小为
(0 x 0)

my
onMeasure()中的
measureSpecs
正好是0。我不知道这意味着什么,但我说当你弄乱测量模式时会发生这种情况,虽然我不知道为什么会发生在我看来。 这是源代码

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

然后,当我结束
dragandrop
时,我从拖放回调中调用以下命令,以便将视图布局移动到x和y,然后调用restoreBasies()再次连接所有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)
                }
RestoreBeases():

整个代码都打开了
prepareConstraintsForDrag()
prepareBasies()
位于
TableScene.kt
中。在
tablePlan/ConstructEmptyTablePlan.kt
tablePlan
目录中的
EmptyTableView.kt
中的回调

这是它在活动中的大致外观:


升级到
ConstraintLayout
的1.1.2版:

implementation 'com.android.support.constraint:constraint-layout:1.1.2'
我认为在此版本之前,
center()
可能存在问题。我不认为这会解决你的问题,但它可能会为找到根本问题扫清道路。换句话说,我想你会在屏幕上看到一些不同的东西


我可以说,您的指南
选项\u指南
以某种方式设置为屏幕的宽度。也许这是目的,但如果不是,我会研究如何设置和使用此指南。

这是目的,我可以将其移入以显示菜单。非常感谢你的提示,特别是花时间回答我冗长的问题!我会尽快更新依赖项,我也会保持更新,非常感谢!好啊不管怎样,还是试试1.1.2。这就是我更新依赖项的意思:D伙计,非常感谢你,我从来没有对不起作用的东西这么高兴过^^编辑:忘了链接
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)
    }
implementation 'com.android.support.constraint:constraint-layout:1.1.2'