У меня есть пользовательский класс представления (EmptyTableView
), который обычно работает нормально. Однако в какой-то момент в программе, где я центрирую этот вид в пределах ConstraintLayout
, вид внезапно становится невидимым. Дальнейшие исследования показывают, что представление позиционируется на (0, 0)
с размером (0 x 0)
.
measureSpecs
внутри моего onMeasure()
- EXACTLY 0
. Я не мог понять, что это значит, но кто-то сказал, что это происходит, когда вы возитесь с режимами измерения, хотя я не знаю, почему это происходит на мой взгляд.
Вот исходный код.
В моем приложении у меня есть представление внутри ConstraintLayout
с именем root, и его положение можно изменить с помощью процедуры 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)
}
Весь код на GitHub . prepareConstraintsForDrag()
и prepareBiases()
расположены в TableScene.kt
. Обратный вызов в tabblePlan/ConstructEmptyTablePlan.kt
и EmptyTableView.kt
в каталоге tablePlan
.
Вот как это выглядит примерно в действии:
![After letting go of the dragged view, now the view is at position (0, 0) and has size (0 x 0)](https://i.stack.imgur.com/kxywB.png)