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?
What you need to do is to create a callback from the Child Fragment to the Parent Fragment. In the Onclick in your Child Fragment, call the callback to the Parent Fragment and then in the Parent Fragment, replace the Child Fragment with the desired Fragment.
getSupportFragmentManager and getChildFragmentManager FragmentManager is class provided by the framework which is used to create transactions for adding, removing or replacing fragments. getSupportFragmentManager is associated with Activity consider it as a FragmentManager for your Activity .
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With