getChildFragmentManager()的共享转换不起作用但使用getFragmentManager()

Wak*_*mad 10 animation android android-fragments

我实现了如下片段:

  1. 保持父片段的活动.使用getSupportFragmentManager()添加Parent片段.
  2. 在父片段中,我使用getChildFragmentManager()和transaction来替换childFragment.
  3. 在childFragment中我再次调用childFragment等等....
  4. 除了共享过渡之外,一切正常.
  5. 如果我使用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();
Run Code Online (Sandbox Code Playgroud)

并且显示动画的代码是:

  getFragmentManager()
                .beginTransaction()
                .addSharedElement(transitionView, ViewCompat.getTransitionName(transitionView))
                .replace(R.id.fragment_container, categoryDetailChildFragment)
                .addToBackStack(TAG)
                .commit();
Run Code Online (Sandbox Code Playgroud)

为什么getChildFragmentManager()时没有共享转换?请帮助任何人.

Rub*_*era 1

每个片段都有自己的childFragmentManager。因此,如果您有多个嵌套片段,您应该引用同一片段的 childFragmentManager,与您使用 addSharedElement() 的情况相同。

因此,如果您有:

ActivityA
|_ FragmentB
   |_ FragmentC
      |_ FragmentD
Run Code Online (Sandbox Code Playgroud)

对于片段 C 和片段 D,您应该使用最上面的公共片段的 getChildFragmentManager() - 在这种情况下片段 B - 以确保每个嵌套片段都引用相同的fragmentManager。这就是为什么当您使用 Activity 的 FragmentManager 时它会起作用,因为只有一个 Activity,并且每个 Activity 通过使用 getActivity() 引用同一个 Activity

要在嵌套片段中获取父片段,您可以在嵌套片段的 onAttach() 方法上使用 getParentFragment() 。您还可以将其强制转换为某个类,例如 FragmentB:

override fun onAttach(context: Context) {
    super.onAttach(context)

    val fragment: FragmentB = parentFragment.parentFragment.parentFragment... as FragmentB
}
Run Code Online (Sandbox Code Playgroud)