【问题标题】:Shared transition with getChildFragmentManager() not working but working with getFragmentManager()与 getChildFragmentManager() 共享转换不起作用但与 getFragmentManager() 一起使用
【发布时间】:2017-10-29 21:58:24
【问题描述】:

我实现片段如下:

  1. 用于保存父片段的活动。使用 getSupportFragmentManager() 添加父片段。
  2. 在父片段中,我使用 getChildFragmentManager() 和事务来替换 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();

显示动画的代码是:

  getFragmentManager()
                .beginTransaction()
                .addSharedElement(transitionView, ViewCompat.getTransitionName(transitionView))
                .replace(R.id.fragment_container, categoryDetailChildFragment)
                .addToBackStack(TAG)
                .commit();

为什么getChildFragmentManager()时没有共享过渡?请帮助任何人。

【问题讨论】:

  • 您找到解决方案了吗?我有同样的问题..

标签: android android-fragments animation


【解决方案1】:

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

因此,如果您有:

ActivityA
|_ FragmentB
   |_ FragmentC
      |_ FragmentD

在这种情况下,对于 Fragment C 和 Fragment D-,您应该使用最上面的公共片段的 getChildFragmentManager() -Fragment B,以确保每个嵌套的片段都引用相同的片段管理器。这就是当你使用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
}

【讨论】:

    【解决方案2】:

    从 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 不容易使用!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-19
      • 2021-06-11
      • 2017-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多