Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Proper use of sub sub fragments with (Child)FragmentManager

Tags:

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?

like image 380
prom85 Avatar asked Dec 19 '13 08:12

prom85


People also ask

How do I change fragments to child fragments?

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.

What is the use of getSupportFragmentManager?

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 .


1 Answers

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

like image 58
ashakirov Avatar answered Jan 05 '23 19:01

ashakirov