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

时间:2018-07-01 14:13:12

标签: android android-constraintlayout

我有一个自定义视图类(EmptyTableView),该类通常可以正常工作。但是,在程序的某个位置上,我将此视图放在ConstraintLayout中,该视图突然变得不可见。进一步的调查表明,该视图以大小(0, 0)定位在(0 x 0)处。
measureSpecs中的onMeasure()EXACTLY 0。我不知道这是什么意思,但是someone表示,当您弄乱了测量模式时会发生这种情况,尽管我不知道为什么会这样。 这是源代码。

在我的应用中,我在名为{root的ConstraintLayout内拥有视图,可以通过DragAndDrop过程来更改其位置。
我的计划是让视图对所有4个侧面都具有约束,同时通过约束的偏差控制位置。当我开始拖动视图时,将删除左右约束,并使用setX()setY()控制位置。这是通过此方法完成的(科特琳):

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)
    }

整个代码位于GitHub上。 prepareConstraintsForDrag()prepareBiases()位于TableScene.kt中。 tabblePlan/ConstructEmptyTablePlan.kt目录中EmptyTableView.kttablePlan中的回调。

这是活动内部的大致外观:

After starting the activity While dragging (the upper right is the dragshadow, there was my thumb while taking the picture, in the middle the actual view which I don't hide for debugging After letting go of the dragged view, now the view is at position (0, 0) and has size (0 x 0)

1 个答案:

答案 0 :(得分:2)

升级到ConstraintLayout的1.1.2版本:

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

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

我可以说您的准则options_guide已通过某种方式设置为屏幕的宽度。也许这是目的,但如果不是,我将研究如何设置和使用该指南。