Правильное использование суб-фрагментов с помощью (Child) 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

Вы должны добавить 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 метод