You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fragment中OnBackPressedCallback失效如何修复?

问题分析与解决方案

你的代码无法触发返回键逻辑的核心原因是错误使用了OnBackPressedDispatcher.addCallback的重载方法:你在addCallback的lambda参数内部创建了OnBackPressedCallback实例,但这个实例并未被正确注册到Dispatcher中,导致返回键事件完全不会触发你的自定义逻辑。

以下是两种修正方案:

方案一:使用lambda式重载(推荐,代码更简洁)

Log.d("Fragment", "onViewCreated")
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) {
    Log.d("Fragment", "Back pressed")
    if (binding.crimeTitle.text.isBlank()) {
        Toast.makeText(context, "Title can't be empty!", Toast.LENGTH_SHORT).show()
        Log.d("Fragment", "Toast showed")
    } else {
        Log.d("Fragment", "BackStack popped")
        findNavController().popBackStack()
    }
}

这个重载会自动帮你创建并注册一个OnBackPressedCallback,lambda内的代码就是handleOnBackPressed方法要执行的逻辑。

方案二:显式创建并注册Callback

Log.d("Fragment", "onViewCreated")
val callback = object : OnBackPressedCallback(true) {
    override fun handleOnBackPressed() {
        Log.d("Fragment", "Back pressed")
        if (binding.crimeTitle.text.isBlank()) {
            Toast.makeText(context, "Title can't be empty!", Toast.LENGTH_SHORT).show()
            Log.d("Fragment", "Toast showed")
        } else {
            Log.d("Fragment", "BackStack popped")
            findNavController().popBackStack()
        }
    }
}
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, callback)

这种方式需要将创建好的OnBackPressedCallback实例作为第二个参数传入addCallback,确保Dispatcher能正确接收并触发它。

内容的提问来源于stack exchange,提问作者Viktor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 13:25:19