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

时间:2013-12-19 08:28:14

标签: android fragment fragmentmanager

如何正确使用碎片中的碎片?

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

----------------------------------------------------------
- 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会被添加两次......如果我使用活动的FragmentManager,那么它可以正常工作......但为什么它不适用于ChildFragmentManager?当然,片段是一个新片段,但是活动也是一个新片段,那么为什么它与活动的FragmentManager一起使用而不与父片段的一个一起工作?

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

1 个答案:

答案 0 :(得分:10)

您应该将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();
        }
      }
    }

或者您可以在Fragment方法

中将子片段添加到onCreate