我实现的 fragment 如下:
- 保存父 fragment 的 Activity 。使用 getSupportFragmentManager() 添加父 fragment 。
- 在父 fragment 中,我使用 getChildFragmentManager() 和事务来替换 childFragment。
- 在 childFragment 中,我再次调用 childFragment 等等......
- 除共享过渡外一切正常。'
- 如果我使用 getFragmentManager() 而不是 getChildFragmentManager() 则存在共享转换,但没有 getChildFragmentManager() 的概念。
代码示例如下所示:
/*This code does not show animation*/
getChildFragmentManager()
.beginTransaction()
.addSharedElement(transitionView, ViewCompat.getTransitionName(transitionView))
.replace(R.id.fragment_container, categoryDetailChildFragment)
.addToBackStack(TAG)
.commit();
显示动画的代码是:
getFragmentManager()
.beginTransaction()
.addSharedElement(transitionView, ViewCompat.getTransitionName(transitionView))
.replace(R.id.fragment_container, categoryDetailChildFragment)
.addToBackStack(TAG)
.commit();
为什么在getChildFragmentManager()的时候没有shared transition?请帮助任何人。
最佳答案
每个 fragment 都有自己的childFragmentManager。因此,如果您有多个嵌套的 fragment ,您应该引用同一个 fragment 的 childFragmentManager,您在其中使用 addSharedElement()。
因此如果你有:
ActivityA
|_ FragmentB
|_ FragmentC
|_ FragmentD
在这种情况下,对于 fragment C 和 fragment D,您应该使用最高公共(public) fragment 的 getChildFragmentManager() - fragment B,以确保每个嵌套 fragment 都引用相同的 fragment 管理器。这就是为什么当您使用 Activity 的 fragmentManager 时它起作用的原因,因为只有一个 Activity,并且每个 Activity 都通过使用 getActivity() 引用同一个
要在嵌套 fragment 中获取父 fragment ,您可以在嵌套 fragment 的 onAttach() 方法上使用 getParentFragment() 。您也可以将它转换到某个类,例如 FragmentB:
override fun onAttach(context: Context) {
super.onAttach(context)
val fragment: FragmentB = parentFragment.parentFragment.parentFragment... as FragmentB
}
关于android - 与 getChildFragmentManager() 的共享转换不起作用但与 getFragmentManager() 一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47005665/