Я следовал инструкциям здесь .
Вот мой код:
val navDirections = PostsListFragmentDirections.actionPostsListFragmentToPostDetailFragment(post)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
val animationExtras = FragmentNavigatorExtras(
title to title.transitionName,
body to body.transitionName
)
navigateWithAnimations(navDirections, animationExtras)
} else {
navigateTo(navDirections)
}
navigateTo
и navigateWithAnimations
являются функциями расширения:
fun Fragment.navigateTo(navDirections: NavDirections) {
NavHostFragment.findNavController(this).navigate(navDirections)
}
fun Fragment.navigateWithAnimations(navDirections: NavDirections, extras: Navigator.Extras) {
NavHostFragment.findNavController(this).navigate(navDirections, extras)
}
Код выполняется, но анимация не работает.
Вот файл nav_graph.xml
<fragment
android:id="@+id/postsListFragment"
android:name="PostsListFragment"
android:label="PostsListFragment">
<action
android:id="@+id/action_postsListFragment_to_postDetailFragment"
app:destination="@id/postDetailFragment">
<argument
android:name="post"
app:argType="Post"
app:nullable="true"
android:defaultValue="@null" />
</action>
</fragment>
<fragment
android:id="@+id/postDetailFragment"
android:name="PostDetailsFragment"
android:label="PostDetailFragment">
<argument
android:name="post"
app:argType="Post"
app:nullable="true"
android:defaultValue="@null" />
</fragment>
А вот как я устанавливаю представление во второй (целевой фрагмент):
private val args: PostDetailsFragmentArgs by navArgs()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
args.post?.let { post ->
tv_title.text = post.title
tv_body.text = post.title
}
}
В обоих XML-файлах я определил:
android:transitionName="transition_title"
android:transitionName="transition_body"