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

时间:2017-10-29 21:58:25

标签: android android-fragments animation

我实现了如下片段:

  1. 保留父片段的活动。使用getSupportFragmentManager() 添加父片段。
  2. 在父片段中,我使用getChildFragmentManager()和transaction替换childFragment。
  3. 在childFragment中,我再次调用childFragment等等....
  4. 一切正常,除了共享转换。'
  5. 如果我使用getFragmentManager()而不是getChildFragmentManager(),则会有共享转换,但是没有getChildFragmentManager()的概念。
  6. 代码示例如下:

    /*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()时没有共享转换?请帮助任何人。

2 个答案:

答案 0 :(得分:1)

每个片段都有自己的childFragmentManager。因此,如果您有多个嵌套片段,一个片段又一个片段,则应引用同一片段的childFragmentManager,在该片段中,您将使用addSharedElement()。

因此,如果您有:

ActivityA
|_ FragmentB
   |_ FragmentC
      |_ FragmentD

在这种情况下,对于片段C和片段D-,应使用最新的通用片段的getChildFragmentManager()-Fragment B,以确保每个嵌套片段都引用相同的fragmentManager。这就是为什么当您使用活动的fragmentManager时它可以工作的原因,因为只有一个活动,并且每个活动都使用getActivity()引用同一活动

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

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

    val fragment: FragmentB = parentFragment.parentFragment.parentFragment... as FragmentB
}

答案 1 :(得分:0)

从 15:00 到 17:00 观看此视频片段技巧(Google I/O '17)

我遇到了同样的问题。就这样做!

在您的 onCreateView 方法中:

postponeEnterTransition();
final ViewGroup group = inflater.inflate(R.layout.layout_to_inflate,container,false);

ViewTreeObserver.OnGlobalLayoutListener treeObserver = new ViewTreeObserver.OnGlobalLayoutListener(){

@Override
        public void onGlobalLayout() {
            startPostponedEnterTransition();
            group.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        }    
}


group.getViewTreeObserver().addOnGlobalLayoutListener(treeObserver);

确保在调用 addSharedElement() 片段事务调用时调用 setReorderingAllowed(true)!

尝试一下,动画应该可以流畅运行。我知道 Android Fragments 不容易使用!