【问题标题】:Bottom Navigation with Drawer Layout | onBackPressed in Fragment带抽屉布局的底部导航 | onBackPressed 在片段中
【发布时间】:2021-11-03 19:00:38
【问题描述】:

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

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

屏幕:

为了让Drawer LayoutBottom Navigation打开,我使用了这个代码:

    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,而不是离开app,我回到之前的fragment

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

我该怎么办?

我想以某种方式覆盖 onBackPressedHome Fragment 但我不明白该怎么做

【问题讨论】:

    标签: java android kotlin navigation-drawer bottomnavigationview


    【解决方案1】:

    您可以在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()
    }
    

    【讨论】:

    • 感谢回答,我已经用addCallback试过了,但是问题是当我切换到另一个fragment时,这个сallback仍然存在,结果我的应用可以关闭了来自所有片段。
    • 当片段关闭时我应该以某种方式删除这个callback 吗?我该怎么做?
    • 是的,还需要为回调添加remove(),我已经更新了答案。谢谢
    【解决方案2】:

    我找到了答案。

    一切都与所选答案中的一样,但需要在此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()
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多