Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to manage Backstack with child fragments?

I am having issues with nested/child fragments. My use case is: I have Frag A as parent fragment and FragChild1, FragChild2, FragChild3 as child fragments to be displayed inside Frag A. Now on back press from FragChild3 it should work like :

FragChild3 -> FragChild2 -> FragChild1 -> FragA(ParentFrag).

The code I used to add child fragments are-

for ChildFrag1-

Fragment mChildFragment1 = new ChildFragment1();
        FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
        transaction.replace(R.id.container_view, mChildFragment1);
        transaction.addToBackStack("FragChild1");
        transaction.commit();
        
for ChildFrag2-

Fragment mChildFragment2 = new ChildFragment2();
        FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
        transaction.replace(R.id.container_view, mChildFragment2);
        transaction.addToBackStack("FragChild2");
        transaction.commit();

I have searched through StackOverflow for relevant answers but haven't yet found any proper answer/way of managing backstack for child fragments.

like image 693
Bella Avatar asked Nov 06 '25 01:11

Bella


2 Answers

Your code seems good. Just override onbackpressed method in activity that contains parent fragment and put given code in it.

if (parentfragment.getChildFragmentManager().getBackStackEntryCount() > 1) {
    parentfragment.getChildFragmentManager().popBackStackImmediate();
} else {
    super.onBackPressed();
}
like image 69
Amninder Singh Avatar answered Nov 08 '25 15:11

Amninder Singh


Now this behavior can be implemented with OnBackPressedDispatcher without overriding onBackPressed in an Activity.

In your parent fragment (where your fragment container is located) add this code in onAttach method:

override fun onAttach(context: Context) {
    super.onAttach(context)
    val backCallback = object : OnBackPressedCallback(true) {
        override fun handleOnBackPressed() {
            // Remove all fragments from the childFragmentManager,
            // but exclude the first added child fragment.
            // This child fragment will be deleted with its parent.
            if (childFragmentManager.backStackEntryCount > 1) {
                childFragmentManager.popBackStack()
                return
            }
            // Delete parent fragment
            parentFragmentManager.popBackStack()
        }
    }
    requireActivity().onBackPressedDispatcher.addCallback(this, backCallback)
}

Than add fragments in your container like this:

childFragmentManager.commit {
    replace(R.id.fragmentContainerRoot, fragment)
    addToBackStack(null)
}
like image 38
Daniil Pavlenko Avatar answered Nov 08 '25 16:11

Daniil Pavlenko



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!