我有一个自定义视图类(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.kt
和tablePlan
中的回调。
这是活动内部的大致外观:
答案 0 :(得分:2)
升级到ConstraintLayout
的1.1.2版本:
implementation 'com.android.support.constraint:constraint-layout:1.1.2'
我认为此版本之前的center()
可能存在问题。我认为这不会解决您的问题,但可能会为查找根本问题开辟道路。换句话说,我认为您会在屏幕上看到一些不同的东西。
我可以说您的准则options_guide
已通过某种方式设置为屏幕的宽度。也许这是目的,但如果不是,我将研究如何设置和使用该指南。