I'm handling back button of device via fragments but while calling from nested fragments I'm facing issue. It always calls the backPressed
method of MainActivity
. I'm handling it as:
class MainActivity : BaseActivity() {
protected fun goToHome() {
findNavController(R.id.nav_host_fragment).navigate(R.id.global_action_pop_to_home)
}
override fun onBackPressed() {
if (supportFragmentManager.backStackEntryCount != 0) {
supportFragmentManager.popBackStackImmediate()
} else {
return super.onBackPressed()
}
}
}
Here I'm calling MainTabFragment
which is having one more fragment container where I'm loading some child fragments as.
class MainTabFragment : BaseFragment() {
fun loadFragment(fragment: Fragment, addToBackStack: Boolean = false, arguments: Bundle? = null): Boolean {
//switching fragment
val fragmentTransaction: FragmentTransaction = childFragmentManager.beginTransaction()
if (addToBackStack) {
fragmentTransaction.add(R.id.main_container, fragment)
fragmentTransaction.addToBackStack(fragment.javaClass.name)
} else {
fragmentTransaction.replace(R.id.main_container, fragment)
}
fragment.arguments = arguments
fragmentTransaction.commit()
return true
}
private fun handleBack() {
val callback: OnBackPressedCallback =
object : OnBackPressedCallback(true /* enabled by default */) {
override fun handleOnBackPressed() {
view?.hideKeyboard()
}
}
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, callback)
}
}
This is the Child fragment what I'm adding in main_container
fragment.
open class HomeFragment : BaseFragment() {
private fun handleBack() {
val callback: OnBackPressedCallback =
object : OnBackPressedCallback(true /* enabled by default */) {
override fun handleOnBackPressed() {
if (viewModel.isContact) {
showDiscardCredentialDialog()
} else {
// findNavController().popBackStack()
//Here f gets null when I press back button
val f: Fragment? = childFragmentManager.findFragmentById(R.id.main_container)
if (f is HomeFragment) // do something with f
childFragmentManager.popBackStackImmediate()
}
}
}
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, callback)
}
}
Here I want to handle back press from nested fragment and open the last added fragment. TIA.