首页 > 解决方案 > 导航组件的共享视图转换不起作用

问题描述

我已按照文档使用新的导航组件实现共享视图转换,但它不起作用。这就是我所拥有的:

片段 A 有这个代码来调用片段 B

val extras = FragmentNavigatorExtras(
                taskNameInput to "taskName")

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

看一下布局,id 的转换名称设置如下:

<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 时,播放enter 动画,但不播放sharedView 过渡。有什么线索吗?谢谢

标签: androidandroid-transitionsshared-element-transitionandroid-architecture-navigation

解决方案


缺少将 sharedTransition 设置为 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>

在这篇文章的时候,新导航组件的文档中还没有写,但这只是旧的做法。由于导航组件为进入/退出转换做了一些神奇的事情,我期待为共享视图做更多的事情。无论如何,添加这些行并不是什么大不了的事。


推荐阅读