Переходы общего просмотра с навигационным компонентом не работают

#android #android-transitions #shared-element-transition #android-architecture-navigation

#Android #android-переходы #переход общего элемента #android-архитектура-навигация

Вопрос:

Я следил за документами, чтобы реализовать переходы общего просмотра с новым навигационным компонентом, и это не работает. Это то, что у меня есть:

Фрагмент A содержит этот код для вызова фрагмента B

 val extras = FragmentNavigatorExtras(
                taskNameInput to "taskName")

findNavController().navigate(R.id.action_aFragment_to_BFragment,
            null), // Bundle of args
            null, // NavOptions
            extras)
  

Взглянув на макет, идентификатор имеет имя перехода, заданное следующим образом:

 <com.google.android.material.textfield.TextInputLayout
        android:id="@ id/taskNameInput"
        android:transitionName="taskName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        ...
  

Тогда FragmentB имеет следующий вид в макете:

 <com.google.android.material.textfield.TextInputLayout
        android:id="@ id/taskNameInput"
        android:transitionName="taskName"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        ...>
  

При переходе от fragmentA к FragmentB воспроизводится анимация ввода, но не переход SharedView. Есть какие-нибудь подсказки? Спасибо

Ответ №1:

Не хватает настройки общего перехода на FragmentB, что можно выполнить в onCrateView() следующим образом:

 override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
    sharedElementEnterTransition = TransitionInflater.from(context).inflateTransition(R.transition.move)

    return inflater.inflate(com.meanwhile.flatmates.R.layout.fragment_b, container, false)
}
  

Также вам необходимо создать файл транзакции move.xml:

 <transitionSet>
    <changeBounds/>
    <changeTransform/>
    <changeClipBounds/>
    <changeImageTransform/>
</transitionSet>
  

На момент написания этого поста в документах для нового навигационного компонента это не указано, но это просто старый способ выполнения. Поскольку навигационный компонент творит какую-то магию для перехода входа / выхода, я ожидал сделать еще кое-что для переходов общего просмотра. В любом случае, добавить эти строки не составит большого труда.

Комментарии:

1. вы имеете в виду, что мне просто нужно добавить res.transition.move.xml эти строки без дополнительных тегов? Если это так, это работает довольно странным образом. Изображение просто переместите из правого верхнего угла в левый нижний. Я полагаю, анимация перехода должна работать по-другому. Чего мне не хватает?

2. Это обычный переход, но он действительно зависит от того, чего вы хотите достичь. Возможно, вам потребуется использовать теги или другие преобразования, возможно, вы даже сможете сэкономить несколько и упростить,