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