user5386763
user5386763

Reputation:

Back in fragment and nested fragment

i have app like this

one activity and inside it >

  1. fragment a (loaded when run app also from menu can open it )
  2. fragment b (open it from just menu)
  3. fragment c (can open it from fragment a and also can open it from menu)

also inside fragment c there are 4 child fragments

in main activity(using navigation drawer as source) i call fragment a in oncreate like this

 FragmentManager fragmentManager=getSupportFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.fragment_place,new First_Fragment()).addToBackStack("First").commit();

my problem is how to control back button to always back to fragment a and when fragment a is open close app i was using addToBackStack(null) but is not what i want because will show all history of fragments that i opened

Upvotes: 1

Views: 2141

Answers (2)

Deepak Goyal
Deepak Goyal

Reputation: 4917

addToBackStack(String tag) is used to add the fragment to backstack and it contains the string as parameter. This parameter can be null or have some value. If you pass null, it will add your fragment to backstack with tag null. addToBackStack(null) doesn't mean that your fragment is not added to backstack.
If you want your fragment will not be added to backstack, then just delete this line.

If you are adding your fragment to backstack and want it to be visible onBackPressed, then you can use

getSupportFragmentManager().popBackStackImmediate(/* Fragment TAG */,0);

CODE:- Try the below code and let me know.

  1. Copy the below function in your main Activity.

    /**
     * function to show the fragment
     *
     * @param name fragment to be shown
     * @param tag  fragment tag
     */
     public void showFragment(Fragment name, String tag) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        // check if the fragment is in back stack
        boolean fragmentPopped = fragmentManager.popBackStackImmediate(tag, 0);
        if (fragmentPopped) {
           // fragment is pop from backStack
        } else {
           FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
           fragmentTransaction.replace(R.id.fragment_container, name, tag);
           fragmentTransaction.addToBackStack(tag);
           fragmentTransaction.commit();
        }}
    
  2. Show fragment using the below code.

    showFragment(yourFragment, yourFragmentTag);

  3. In mainActivity onBackPressed.

    @override public void onBackPressed(){ FragmentTransaction fts = getSupportFragmentManager().beginTransaction(); FragmentManager fragmentManager = getSupportFragmentManager(); if (fragmentManager.getBackStackEntryCount() >= 2) { // always show your fragment a here showFragment(new FragmentA(), FragmentA.class.getSimpleName()); } else { // finish your activity } }

Upvotes: 1

JLamkin
JLamkin

Reputation: 721

When adding fragment a to the back stack "addToBackStack(String name)" pass in a name.

Then listen for on back presses in your fragments

FragmentManager fm = getFragmentManager();
fm.addOnBackStackChangedListener(new OnBackStackChangedListener() {
    @Override
    public void onBackStackChanged() {
    }
});

make sure to stop listening when each fragment is not being shown.

Then you can pop back to the named fragment added to the back stack

    FragmentManager fm = getActivity()
            .getSupportFragmentManager();
    fm.popBackStack ("name", FragmentManager.POP_BACK_STACK_INCLUSIVE);

Make sure the rest of your fragment transactions are not added to the back stack. This should give you the behavior you want.

Upvotes: 1

Related Questions