如何用OnBackPressedDispatcher替代Activity中最简单的onBackPressed逻辑?
适配Android SDK 33:替换弃用的onBackPressed()为onBackPressedDispatcher的解决方案
要实现原代码中「先执行自定义逻辑,再让系统处理返回操作」的需求,可以通过onBackPressedDispatcher添加一个始终启用的回调来完成,具体实现如下:
替换后的代码示例
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 其他初始化代码... onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { // 先执行你的自定义逻辑 setResult(Activity.RESULT_CANCELED) // 禁用当前回调,避免触发系统返回时循环调用自身 isEnabled = false // 触发系统默认的返回流程,等价于原代码中的super.onBackPressed() onBackPressedDispatcher.onBackPressed() // 重新启用回调,保证下次返回仍会执行自定义逻辑 isEnabled = true } }) }
关键逻辑说明
- 初始化
OnBackPressedCallback(true)时传入true,表示这个回调始终处于启用状态,无需手动切换。 - 调用
isEnabled = false是必要的:如果直接调用onBackPressedDispatcher.onBackPressed(),当前回调会再次被触发,导致无限循环。禁用后,系统会执行默认的返回逻辑(比如弹出Fragment返回栈、finish当前Activity等)。 - 执行完系统返回逻辑后,重新设置
isEnabled = true,确保用户下次按下返回键时,依然会先执行你的自定义代码。
如果你的场景中没有Fragment返回栈等复杂返回逻辑,也可以直接在自定义逻辑后调用finish()来替代系统默认返回,但上面的方案更通用,完全匹配原代码的行为。
内容的提问来源于stack exchange,提问作者500865
相关产品推荐
相关产品推荐

