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

23

如何正确地在片段中使用片段?

我的(简化的)用例是这样的,我有一个带有布局片段的活动,该片段本身包含一个子片段...所有片段都手动添加到其父级中...

----------------------------------------------------------
- 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代码片段中,我获取/创建了我的SubFragment:

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)会被添加两次…… 如果我使用活动(Activity)的FragmentManager,那么它会起作用…… 但是为什么使用ChildFragmentManager就不起作用呢? 当然,该片段(Fragment)是一个新片段,但活动(Activity)也是一个新的,所以为什么使用活动的FragmentManager可以正常工作,而使用父片段(Parent Fragment)的就不行呢?

在片段中,我应该使用片段的ChildFragmentManager,对吗?


1
不是同一个问题,但对于其他来到这里的人,请参见相关的Android中嵌套片段之间的通信 - Suragch
1个回答

12

您应该像将Fragment添加到Activity的方式一样,将SubFragment添加到Fragment中。我的意思是将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中。


我认为这就是原帖中提出的问题。 - lionelmessi
1
@lionelmessi 不是,他使用的是onCreateView而不是onCreate。我认为这才是正确的答案。 - HaydenKai
3
如果片段A持有B,B持有C,那么是否应该使用子片段管理器添加片段C? - Rahul Rastogi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接