Handling back button in Android Navigation Component

前端 未结 23 1350
遥遥无期
遥遥无期 2020-11-29 18:20

I\'d like to know how properly handle system back button action using Navigation Controller. In my app I have two fragments (for ex. fragment1 and fragment2) and I have an a

23条回答
  •  旧巷少年郎
    2020-11-29 19:19

    I tried Jurij Pitulja solution but I just wasn't able to find getOnBackPressedDispatcher or addOnBackPressedCallback also using Kiryl Tkach's solution wasn't able to find the current fragment, so here's mine:

    interface OnBackPressedListener {
        fun onBackPressed(): Boolean
    }
    
    override fun onBackPressed() {
        val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment)
        val currentFragment = navHostFragment?.childFragmentManager!!.fragments[0]
        if (currentFragment !is OnBackPressedListener || !(currentFragment as OnBackPressedListener).onBackPressed()) super.onBackPressed()
    

    this way you can decide in fragment whether the activity should take control of back pressed or not.

    Alternatively, you have BaseActivity for all your activities, you can implement like this

    override fun onBackPressed() {
        val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment)
        if (navHostFragment != null){
            val currentFragment = navHostFragment.childFragmentManager.fragments[0]
            if (currentFragment !is AuthContract.OnBackPressedListener ||
                    !(currentFragment as AuthContract.OnBackPressedListener).onBackPressed()) super.onBackPressed()
        } else {
            super.onBackPressed()
        }
    }
    

提交回复
热议问题