I have three fragments A, B and C. And I'm using navHostFragment
container in MainActivity
. So the application goes from A -> B using kotlin extension function findNavController().navigate...
and then go from B to C using same function. All works fine till here.
Now in Fragment C, I'm replacing different elements on fragment C using
activity?.supportFragmentManager
?.beginTransaction()
?.replace(R.id.list_container, someFragment)
?.addToBackStack("some_frag_id")
?.commit()
The list_container
is replaced with someFragment
. After this when I press physical back button Fragment C pops out and my app goes to Fragment B while what I expect it to restore replaced list_container
i.e. whatever was there before replacement.
I'm also overiding this in my MainActivity
override fun onBackPressed() {
val count = supportFragmentManager.backStackEntryCount
if (count == 0) {
super.onBackPressed()
//additional code
}
else {
supportFragmentManager.popBackStack()
}
}
I'm not sure what is missing here. I have read a lot of solutions on stackoverflow but none worked to my satisfaction. Please guide.
If you are adding a Fragment to a View within a Fragment, you must always use the childFragmentManager
- using activity?.supportFragmentManager
is always the wrong FragmentManager to use in that case.
Besides fixing cases with restoring state (which would not work when using the wrong FragmentManager), this also ensures that the default behavior for dispatching onBackPressed()
down the FragmentManager hierarchy will work out the box - you should not need any logic at all in onBackPressed()
to have the pop work correctly.
If you need to intercept the back button in Fragment C, you should follow the providing custom back documentation to register an OnBackPressedDispatcher
- you should not override onBackPressed()
even in those cases.