Android MotionLayout setGuidelinePercent не работает над выпуском alpha4 - PullRequest
2 голосов
/ 17 апреля 2019

У меня в приложении есть MotionLayout для перехода по смахиванию. В настоящее время я только что обновил с 2.0.0-alpha3 до 2.0.0-alpha4 релиз, и некоторые вещи не работают, как раньше. Существует «myView», который представляет собой макет, который должен расширяться от нижней части экрана до представления заголовка. У этого есть ограничение сверху Руководства, которым я должен управлять программно (основанный на некоторых пользовательских действиях).

Других изменений в коде не было, поэтому при переходе на alpha3 все работает так, как ожидалось.

Код довольно простой:

<MotionScene xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:motion="http://schemas.android.com/apk/res-auto">

    <Transition
        motion:constraintSetEnd="@id/end"
        motion:constraintSetStart="@id/start"
        motion:duration="1000"
        motion:interpolator="linear">
        <!-- I used motion:motionInterpolator="linear" for alpha4-->

        <OnSwipe
            motion:dragDirection="dragUp"
            motion:touchAnchorId="@id/myView"
            motion:touchAnchorSide="top" />

    </Transition>

    <ConstraintSet android:id="@+id/start">
        <Constraint
            android:id="@id/myView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            motion:layout_constraintStart_toStartOf="parent"
            motion:layout_constraintTop_toTopOf="@id/myGuideline" />
    </ConstraintSet>

    <ConstraintSet android:id="@+id/end">
        <Constraint
            android:id="@id/myView"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            motion:layout_constraintBottom_toBottomOf="parent"
            motion:layout_constraintStart_toStartOf="parent"
            motion:layout_constraintTop_toBottomOf="@id/someHeaderView" />
    </ConstraintSet>
</MotionScene>

Проблема в том, что в выпуске alpha3 я мог использовать что-то вроде этого (и это сработало):

myMotionLayout.getConstraintSet(R.id.start)?.setGuidelinePercent(R.id.myGuideline, guidelinePercentage)

Теперь, когда я обновился до 2.0.0-alpha4, это больше не работает, и я не могу понять, почему. Он всегда принимает значение по умолчанию из xml и никогда не изменяется, когда я пытаюсь сделать это динамически.

То, что я пытаюсь сделать, - это изменить начальную точку перехода на основе некоторых динамических данных (доступных в начале фрагмента или когда пользователь возвращается к нему). Если у вас есть лучшее представление о том, как я могу реализовать это с помощью MotionLayout, пожалуйста, дайте мне подсказку.

Реализация Gradle:

implementation "com.android.support.constraint:constraint-layout:2.0.0-alpha4"

1 Ответ

0 голосов
/ 28 мая 2019

Я заметил похожую регрессию, представленную в выпуске alpha4.Методом проб и ошибок, а также следующим отчетом об ошибке я смог добиться того, чтобы мои изменения ConstraintSet были применены программно в MotionLayout (бета-версия).Похоже, что метод клонирования не работает для MotionLayout, и вместо него следует использовать getConstraintSet (как вы сделали).Похоже, шаг, который вы пропустили, constraintSet.applyTo(motion_layout).Мне также нужно было повторно применить описание XML MotionLayout в конце.

реализация "androidx.constraintlayout: constraintlayout: 2.0.0-beta1"

Шаги:

val constraintSet = motion_layout.getConstraintSet(R.id.motion_layout)
constraintSet.clear(R.id.txt_view, ConstraintSet.BOTTOM)
constraintSet.applyTo(motion_layout)
// If using a MotionLayout description xml file, re-apply it
motion_explore_article.loadLayoutDescription(R.xml.slide_over_image)

Сообщение об ошибке: https://issuetracker.google.com/issues/131874827

...