Android MotionLayout setGuidelinePercent не работает в версии alpha4

#android #android-layout #kotlin #android-motionlayout

#Android #android-макет #kotlin #android-motionlayout

Вопрос:

У меня есть 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. Я сталкиваюсь с аналогичной проблемой: я пытаюсь удалить ограничение из MotionLayout программно, используя val constraintSet = ConstraintSet() constraintSet.clone(motion_layout) constraintSet.clear(R.id.txt_view, ConstraintSet.BOTTOM) constraintSet.applyTo(motion_layout) , что оно работает с использованием ConstraintLayout alpha 3, но перестает работать с alpha 4 до последней бета-версии 1. Интересно, что при повороте устройства удаление ограничений происходит, как и ожидалось.

Ответ №1:

Я заметил аналогичную регрессию, представленную в версии alpha4. Методом проб и ошибок и следующего сообщения об ошибке мне удалось добиться, чтобы изменения в наборе ограничений применялись программно в MotionLayout (версия beta1). Похоже, метод clone не работает для 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