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
相关产品推荐
相关产品推荐

