Fragment调用onBackPressedDispatcher遇循环问题,求排查方案
问题原因及解决方案
你遇到循环的核心原因是:在用户确认返回后,你再次调用了activity?.onBackPressedDispatcher?.onBackPressed(),这会重新触发你添加的OnBackPressedCallback——哪怕你设置了isEnabled = false,也可能因为时序或返回逻辑的问题,导致回调再次执行,弹出对话框,形成无限循环。
正确的实现方式
不需要通过再次调用onBackPressed()来触发返回,直接执行你需要的返回动作即可:
方案1:返回上一个Fragment(需当前Fragment已通过addToBackStack()加入回退栈)
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val callback = object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { showAlertDialog( message = getString(R.string.myText), dialogCallback = object : AlertDialogInterface { override fun onAlertDialogButtonClicked(alertDialog: AlertDialog?) {} override fun onPositiveButtonClicked(alertDialog: AlertDialog?) { alertDialog?.dismiss() // 直接弹出当前Fragment,回到上一个页面 parentFragmentManager.popBackStack() } override fun onNegativeButtonClicked(alertDialog: AlertDialog?) { alertDialog?.dismiss() } } ) } } activity?.onBackPressedDispatcher?.addCallback(this, callback) }
方案2:直接关闭当前Activity
如果你的需求是确认后退出整个页面,直接调用Activity的finish()方法:
override fun onPositiveButtonClicked(alertDialog: AlertDialog?) { alertDialog?.dismiss() activity?.finish() }
补充说明
如果你的Activity还有其他全局的返回逻辑需要触发,也可以先禁用当前回调,再调用onBackPressed(),但这种方式不如直接执行目标动作稳妥:
override fun onPositiveButtonClicked(alertDialog: AlertDialog?) { isEnabled = false alertDialog?.dismiss() requireActivity().onBackPressedDispatcher.onBackPressed() }
这种写法要确保isEnabled = false已经生效,Dispatcher会跳过当前回调,执行后续的返回逻辑。
内容的提问来源于stack exchange,提问作者Sirop4ik
相关产品推荐
相关产品推荐

