Несмотря на установку размеров, пользовательское представление в ConstraintLayout заканчивается размером 0 - PullRequest
0 голосов
/ 01 июля 2018

У меня есть пользовательский класс представления (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 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 голосов
/ 02 июля 2018

Обновление до версии 1.1.2 ConstraintLayout:

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

Я думаю, что могут быть проблемы с center() до этого выпуска. Я не думаю, что это решит вашу проблему, но это может очистить путь к поиску основной проблемы. Другими словами, я думаю, что вы увидите что-то другое на вашем экране.

Я могу сказать, что ваш ориентир options_guide как-то настроен на ширину экрана. Может быть, это и есть намерение, но если это не так, я бы посмотрел, как это руководство установлено и используется.

...