23

如何在 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 也是一个新的 Fragment,那么为什么它可以与 Activity 一起使用,FragmentManager而不能与父 Fragment 一起使用呢?

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

4

1 回答 1

12

您应该添加SubFragment到与添加到Fragment相同的方式。我的意思是添加应该如下所示:FragmentActivityFragmentActivity

 @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();
   }
 }

添加SubFragmentMainFragment应如下所示:

    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

于 2014-03-11T14:43:05.257 回答