Я использую FragmentManager для замены одного фрагмента другим с переходом общего элемента (два элемента являются общими). Вот код (в Котлине):
private fun showList(edited: EditedAlarm) {
fragmentManager.findFragmentById(R.id.main_fragment_container)?.apply{
exitTransition = Fade()
}
// create a new Fragment and set transitions
val listFragment = AlarmsListFragment().apply {
sharedElementEnterTransition = moveTransition()
enterTransition = Fade()
}
fragmentManager.beginTransaction()
.addSharedElement(viewHolder.digitalClock(), "clock" + viewHolder.alarmId())
.addSharedElement(viewHolder.container(), "onOff" + viewHolder.alarmId())
.replace(R.id.main_fragment_container, listFragment)
.commit()
}
Сам переходы определяется так:
private fun moveTransition(): TransitionSet {
return TransitionSet().lollipop {
ordering = TransitionSet.ORDERING_TOGETHER
addTransition(ChangeBounds())
addTransition(ChangeTransform())
}
}
Этот код работает на моем Moto Z2 Play (Android близок к AOSP) и на моем Motorola One (Android ONE), только если:
Однако идентификатор не работает должным образом, если целевой API равен 26 или выше. Если целевой API установлен на 26, общие элементы не анимируются. Вместо этого оба общих элемента переходят на свои конечные позиции, а все остальное анимируется.
Как я могу заставить его работать без использования библиотеки поддержки? Я пропускаю какой-то атрибут, который нужно установить?
После некоторых исследований и благодаря комментарию от Eugen Pechanec я пришел к выводу, что использование библиотеки поддержки v4 - это путь. Фрагменты платформы устарели в версиях API 28, поэтому рано или поздно нам придется размышлять.
Я не могу сказать, что библиотека поддержки работает безупречно, но по крайней мере переходы общих элементов анимируются.
Я не смог заставить его работать без библиотеки, потратив довольно много времени.