How to pop fragment off backstack
Asked Answered
A

5

91

I have an activity A, which calls fragment Bf, which calls fragment Cf. I want Bf to be placed in the backstack when Cf is called so that users can navigate back to it. However, if a specific button is pressed in Cf, I would like Bf to be removed from the backstack. Is this possible?

I see that there is a popBackStack() function. However, I am a little confused on how this would work. Is it safe to use this function? Is there any possibility that an activity from a different application would be inserted after Bf on the backstack?

Also, is there any way to alter the savedInstanceState of the fragment on the backstack?

I just can't figure out how to do a robust test on the backstack using the emulator.

Arlin answered 20/2, 2013 at 3:28 Comment(2)
Avoid using back stacks! it doesn't really help with the overall efficiency! use plain replace() or even better remove/add every time you want to navigate! Check my post on #5802641Lauree
@Lauree not a good idea. BackStacks are a great thing. Btw I can't see your post. I guess it was downvoted. :PEmbroideress
O
147

You can pop the fragment by name. While adding fragments to the back stack, just give them a name.

fragmentTransaction.addToBackStack("fragB");
fragmentTransaction.addToBackStack("fragC");

Then in Fragment_C, pop the back stack using the name ie.. fragB and include POP_BACK_STACK_INCLUSIVE

someButtonInC.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {

        FragmentManager fm = getActivity()
                .getSupportFragmentManager();
        fm.popBackStack ("fragB", FragmentManager.POP_BACK_STACK_INCLUSIVE);
    }
});
Observable answered 20/2, 2013 at 6:25 Comment(6)
It will work even if we pass no parameters too in the fm.popBackStack Method. fm.popBackStack();Gaskin
what if I want to make it on back button press?Otho
@Akki if you are using add to backstack it will already pop the last fragment added when you hit the back navigation item. So no extra steps are necessary to perform a normal navigation back. Only time you need to override on back button pressed is when you want to do something other than a normal one step back navigation.Othella
What if that fragment was the first fragment, then addToBackStack with replace will cause a problem. Any way to do this without calling addToBackStack?Lymphosarcoma
According to doc "all states up to that state will be popped", not just a specific fragment.Sangsanger
@VahidGhadiri That is how the Stack Data structure is designed.Aconite
I
27

Three ways to pop Fragment off BackStack

Simply add any of these lines:

1)

getActivity().getSupportFragmentManager().popBackStack();

2)

getActivity().getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

3)

getActivity().getSupportFragmentManager().popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

They're all easy ways to pop fragment off Backstack

Influential answered 30/7, 2018 at 7:10 Comment(1)
Thank you so muchhhhh! After overiding onbackpressed, this really helped me to go back. I searched for about an hourImprobable
C
3

You can try this way

val fm= parentFragmentManager
fm.popBackStack("group", FragmentManager.POP_BACK_STACK_INCLUSIVE)
Catling answered 17/8, 2022 at 13:16 Comment(0)
C
1

first replacing fragment container_view that time we add name as like "Later Transaction"

   getSupportFragmentManager().beginTransaction().replace(R.id.container_view, 
    profileFragment, "Profile").addToBackStack("Later Transaction").commit();

then on back press button pop the back stack using the Later Transaction name

     int count = getSupportFragmentManager().getBackStackEntryCount();
    if(count > 1) {
     getSupportFragmentManager().popBackStack("Later Transaction", 
     FragmentManager.POP_BACK_STACK_INCLUSIVE);
    } else {
        DialogUtils.show(HomeActivity.this, 
        getString(R.string.exit_app_message), getString(R.string.alert), 
       "Yes","No", new DialogUtils.ActionListner() {
            @Override
            public void onPositiveAction() {
                finish();
            }
            @Override
            public void onNegativeAction() {
            }
        });
    }
Calces answered 27/10, 2018 at 11:39 Comment(1)
Great solution for manage back stack entry count of fragmentsCalces
C
0

Here's example to pop last fragment using BackStackEntry

val manager = supportFragmentManager
try {
    // get last entry (you can get another if needed)
    val entry = manager.getBackStackEntryAt(manager.backStackEntryCount - 1)
    // you can pop it by name
    manager.popBackStack(entry.name, FragmentManager.POP_BACK_STACK_INCLUSIVE)
    // or pop by id
    manager.popBackStack(entry.id, FragmentManager.POP_BACK_STACK_INCLUSIVE)
} catch (ex: Exception) {
    ex.printStackTrace()
}
Campinas answered 1/6, 2020 at 13:42 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.