使用 (Child)FragmentManager 正确使用子子片段

Posted

技术标签:

【中文标题】使用 (Child)FragmentManager 正确使用子子片段【英文标题】:Proper use of sub sub fragments with (Child)FragmentManager 【发布时间】:2014-01-07 17:25:27 【问题描述】:

如何在 Fragments 中正确使用 Fragments?

我的(简化的)用例如下,我有一个带有布局片段的活动,这个片段本身包含一个子片段......所有片段都手动添加到它们的父片段......

----------------------------------------------------------
- Activity                                               -
-                                                        -
-                                                        -
-     ---------------------------------------            -
-     - Fragment                            -            -
-     -                                     -            -
-     -    -----------------                -            -
-     -    - SubFragment   -                -            -
-     -    -               -                -            -
-     -    -               -                -            -
-     -    -----------------                -            -
-     ---------------------------------------            -
-                                                        -
----------------------------------------------------------

现在在我的活动onCreate 中,我执行以下操作:

if (savedInstanceState == null)

    // I create the fragment
    mMainFragment = new MainFragment();
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.fragment_main, mMainFragment);
    transaction.commit();

else

    // I retrieve the fragment
    mMainFragment = (BaseFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_main);

在我的片段onCreate 我得到/创建我的子片段:

mSubFragment = getChildFragmentManager().findFragmentByTag(SubFragment.class.getName());
if (mSubFragment == null)

    mSubFragment = new SubFragment();
    getChildFragmentManager().beginTransaction().add(R.id.fragment_sub, mSubFragment, SubFragment.class.getName()).commit();

问题

屏幕旋转后,我的 SubFragment 添加了两次...如果我使用活动的FragmentManager 那么它可以工作...但是为什么它不适用于ChildFragmentManager?当然,Fragment 是一个新的 Fragment,但 Activity 也是一个新的,为什么它与 Activity 的FragmentManager 一起工作,而与父 Fragment 的不工作?

在片段中,我应该使用片段ChildFragmentManager,不是吗?

【问题讨论】:

不是同一个问题,但是来这里的其他人,请看相关Communication between nested fragments in android 【参考方案1】:

您应该将SubFragment 添加到Fragment,就像将Fragment 添加到Activity 一样。我的意思是将Fragment 添加到Activity 应该是这样的:

 @Override
 public void onCreate(Bundle savedInstanceState) 
   ....
   if (savedInstanceState == null)
      //add fragment
      mMainFragment = new MainFragment();
      FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
      transaction.replace(R.id.fragment_main, mMainFragment);
      transaction.commit();
   
 

SubFragment 添加到MainFragment 应如下所示:

    public class MainFragment extends Fragment

      @Override
      public View onCreateView(LayoutInflater i, ViewGroup c, Bundle savedInstanceState) 
           ...
        if (savedInstanceState == null)
           mSubFragment = new SubFragment();

           //add child fragment
           getChildFragmentManager()
                   .beginTransaction()
                   .add(R.id.fragment_sub, mSubFragment, "tag")
                   .commit();
        
      
    

或者您可以在onCreate 方法中将子片段添加到Fragment

【讨论】:

我认为这就是 OP 发布的问题。 @lionelmessi 不,他使用 onCreateVIEW 与 onCreate。我认为这是正确的答案 如果片段 A 持有 B,B 持有 C,那么是否也应该使用子片段管理器添加片段 C?

以上是关于使用 (Child)FragmentManager 正确使用子子片段的主要内容,如果未能解决你的问题,请参考以下文章

在 DialogFragment 中使用 FragmentManager 和 FragmentTransaction

Android中FragmentManager进行片段回收的目的是啥?

从 Fragment (support.v4) 中获取 FragmentManager [重复]

无法解析方法 show(android.app.FragmentManager, java.lang.String)

UIfragment与fragmentManager

Android 11(仅限)FragmentManager 崩溃 - FragmentManager 已被销毁