带抽屉布局的底部导航 |片段中的 onBackPressed

Bottom Navigation with Drawer Layout | onBackPressed in Fragment

我有一个有趣且令人困惑的问题。

我有一个 Drawer Layout 可以从 Bottom Navigation 打开,就像照片中那样

屏幕:

为了从 Bottom Navigation 打开 Drawer Layout,我使用了以下代码:

    bottomNavigationView.setOnItemSelectedListener { item ->
            when (item.itemId) {
                R.id.itemDrawer -> {
                    drawerLayout.openDrawer(GravityCompat.END)
                    return@setOnItemSelectedListener false
                }
                R.id.homeFragment -> navController.navigate(R.id.homeFragment)
                R.id.booksFragment -> navController.navigate(R.id.booksFragment)
                R.id.grammarFragment -> navController.navigate(R.id.grammarFragment)
                R.id.translatorFragment -> navController.navigate(R.id.translatorFragment)
            }
            true
        }

这就是我的问题所在

在我看来,当我覆盖底部导航的侦听器时,onBackPressed 行为默认会变得混乱。

我的意思是,当我点击 Home,然后点击另一个元素,然后再次点击 Home,等等几次,然后我停留在 Home Fragment 并点击 onBackPressed,然后我没有离开应用程序,而是回到了之前的片段

我认为这对用户来说是不正常的

我该怎么办?

我想以某种方式为 Home Fragment 覆盖 onBackPressed,但我不知道该怎么做

您可以在 HomeFragment

中使用 onBackPressedDispatcher
private lateinit var onBackPressedCallback: OnBackPressedCallback

并实例化实现并将回调添加到 onResume()

中的 activity
override fun onResume() {
    super.onResume()
    onBackPressedCallback = object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                activity?.moveTaskToBack(true)
                exitProcess(ZERO)
            }
        }
    
    activity?.onBackPressedDispatcher?.addCallback(onBackPressedCallback)
}

由于在 activity 添加了此回调,因此应在离开 HomeFragment

时删除回调
override fun onPause() {
    onBackPressedCallback.remove()
    super.onPause()
}

我找到了答案。

一切都与所选答案中的一样,但需要删除此 fragmentonPause 中的此 callback。防止应用程序从所有片段中关闭

1。为 callback

创建一个变量
private lateinit var mCallback: OnBackPressedCallback

2。在 onViewCreated 中:

mCallback = object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                activity?.moveTaskToBack(true)
                exitProcess(0)
            }
        }

activity?.onBackPressedDispatcher?.addCallback(mCallback)

3。关闭 fragment

时删除 callback
 override fun onPause() {
        mCallback.remove()
        super.onPause()
    }