Proper use of sub sub fragments with (Child)FragmentManager
android, fragment, fragmentmanager
Solution
You should add `SubFragment` to `Fragment` the same way like you add `Fragment` to `Activity`. I mean adding `Fragment` to `Activity` should look like:
@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();
}
}
Adding `SubFragment` to `MainFragment` should look like:
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();
}
}
}
or you can add child fragment to `Fragment` in `onCreate` method
Problem
How do I properly use Fragments in Fragments? My (simplified) use case is following, I have an activity with a layout fragment and this fragment theirself contains a sub fragment... all fragments are added manually to their parents... ``` ---------------------------------------------------------- - Activity - - - - - - --------------------------------------- - - - Fragment - - - - - - - - ----------------- - - - - - SubFragment - - - - - - - - - - - - - - - - - ----------------- - - - --------------------------------------- - - - ---------------------------------------------------------- ``` Now in my activity's `onCreate` I do following: ``` 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); } ``` And in my fragments `onCreate` I get/create my 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(); } ``` Problem After screen rotation, my SubFragment is added twice... If I use the activity's `FragmentManager` then it works... But why does it not work with the `ChildFragmentManager`? Of course, the Fragment is a new fragment, but the activity is a new one as well, so why does it work with the activity's `FragmentManager` but not with the parent fragment's one? In a fragment, I should use the fragments `ChildFragmentManager`, shouldn't I?