Android中onBackPressed()已废弃,点击Toolbar返回键时如何使用OnBackPressedDispatcher实现返回导航?
替换废弃的
onBackPressed(),用OnBackPressedDispatcher重构代码 嘿,别担心,这个转换其实很简单,而且OnBackPressedDispatcher比旧的onBackPressed()灵活多了!让我一步步给你讲清楚。
首先,为什么onBackPressed()会被废弃?Android官方希望我们用更可控的方式处理后退操作——OnBackPressedDispatcher允许你添加多个后退回调、拦截后退事件,甚至根据生命周期自动管理回调的有效性,比直接调用onBackPressed()要优雅得多。
直接替换你的现有代码
你的原代码是处理Toolbar的返回按钮,只需要把super.onBackPressed()换成onBackPressedDispatcher.onBackPressed()就可以了。另外注意,原来的else分支返回false其实不太合理,应该交给父类处理其他菜单选项,我顺便帮你优化了这部分:
override fun onOptionsItemSelected(item: MenuItem): Boolean { return when (item.itemId) { android.R.id.home -> { // 替换废弃的onBackPressed() onBackPressedDispatcher.onBackPressed() true } else -> super.onOptionsItemSelected(item) // 交给父类处理其他菜单选项 } }
如果这段代码是在Fragment里(而非Activity),只需要通过requireActivity()获取Dispatcher即可:
requireActivity().onBackPressedDispatcher.onBackPressed()
进阶:自定义后退逻辑(如果需要)
OnBackPressedDispatcher的优势不止于简单替换,如果你需要在后退前做一些操作(比如弹出确认对话框),可以添加自定义回调。比如在Fragment中:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 创建后退回调,参数true表示默认启用该回调 val backCallback = object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { // 这里编写自定义后退逻辑 AlertDialog.Builder(requireContext()) .setTitle("确认退出?") .setMessage("你确定要返回上一页吗?") .setPositiveButton("确定") { _, _ -> // 确认后触发系统默认后退 requireActivity().onBackPressedDispatcher.onBackPressed() // 也可以禁用当前回调,让系统自动处理默认后退 // isEnabled = false } .setNegativeButton("取消", null) .show() } } // 将回调绑定到Fragment的生命周期,自动管理回调的启用/禁用 requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, backCallback) }
这样一来,用户点击任何后退按钮(包括Toolbar返回键和系统返回键),都会先触发你的自定义逻辑,而非直接执行后退,灵活性拉满。
内容的提问来源于stack exchange,提问作者Hector
相关产品推荐
相关产品推荐

