首页 文章

处理Android导航组件中的后退按钮

提问于
浏览
3

我想知道如何使用导航控制器正确处理系统后退按钮操作 . 在我的应用程序中,我有两个片段(例如片段1和片段2),我在fragment1中有一个动作,目的地为fragment2 . 一切都运行良好,除了一件事 - 当用户按下fragment2中的系统后退按钮时,我想显示一个对话框(例如使用DialogFragment)来确认退出 . 实现此行为的最佳方法是什么?如果我在我的主机片段中使用 app:defaultNavHost="true" ,它会自动返回忽略我的规则 . 此外,这个组件是什么?

enter image description here

我应该使用“pop to”吗?

2 回答

  • 2

    这里的解决方案应该做你想要的,但我认为这是一个糟糕的解决方案,因为它违背了Android导航组件的想法(让android处理导航) .

    覆盖您的活动中的“onBackPressed”

    override fun onBackPressed() {
        when(NavHostFragment.findNavController(nav_host_fragment).currentDestination.id) {
            R.id.fragment2-> {
                val dialog=AlertDialog.Builder(this).setMessage("Hello").setPositiveButton("Ok", DialogInterface.OnClickListener { dialogInterface, i ->
                    finish()
                }).show()
            }
            else -> {
                super.onBackPressed()
            }
        }
    }
    
  • 0

    所以,我创建了一个界面

    public interface OnBackPressedListener {
        void onBackPressed();
    }
    

    并通过需要处理后退按钮的所有片段实现它 . 在主要活动中,我覆盖了 onBackPressed() 方法:

    @Override
    public void onBackPressed() {
        final Fragment currentFragment = mNavHostFragment.getChildFragmentManager().getFragments().get(0);
        final NavController controller = Navigation.findNavController(this, R.id.nav_host_fragment);
        if (currentFragment instanceof OnBackPressedListener)
            ((OnBackPressedListener) currentFragment).onBackPressed();
        else if (!controller.popBackStack())
            finish();
    
    }
    

    所以,如果我的导航主机的顶部片段实现 OnBackPressedListener 接口,我调用它的 onBackPressed() 方法,在其他地方我只是弹回堆栈并关闭应用程序,如果后面的堆栈是空的 .

相关问题