Android: Handle back button in nested fragments

451 views Asked by At

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.

0

There are 0 answers