0

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.

Anshul Tyagi
  • 2,076
  • 4
  • 34
  • 65
  • Use Navigation Component from this link https://developer.android.com/guide/navigation. It is more flexible and easy to use and handles the back press scenario very well – Kartik Jun 03 '22 at 12:02
  • @Kartik I tried with `NavigationComponent` but I din't get success. Posted a question also for that here -> https://stackoverflow.com/questions/72374228/how-to-replace-childfragmentmanager-with-navigation-graph-in-android – Anshul Tyagi Jun 23 '22 at 11:17

0 Answers0