Android中使用Kotlin实现指定Fragment内按返回键退出应用
在指定Fragment中拦截返回键退出应用的Kotlin实现
方案一:用OnBackPressedCallback(官方推荐)
这是AndroidX推出的Fragment级返回键处理方案,无需和Activity强耦合,代码更解耦干净。
在SignInFragment和HomeFragment的onViewCreated方法里添加以下代码:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 注册返回键回调 requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) { // 确认当前显示的是当前Fragment(避免多Fragment注册时冲突) val currentFragment = parentFragmentManager.findFragmentById(R.id.fragment_container) if (currentFragment == this@SignInFragment) { // 退出整个应用 requireActivity().finishAffinity() // Android 10+ 彻底清除任务栈 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { requireActivity().finishAndRemoveTask() } } } }
把R.id.fragment_container替换成你MainActivity中承载Fragment的容器ID。
关键说明
viewLifecycleOwner会在Fragment视图销毁时自动注销回调,避免内存泄漏。finishAffinity()会关闭当前任务栈内的所有Activity,刚好满足退出应用的需求;若仅需关闭MainActivity,改用requireActivity().finish()即可。
方案二:通过MainActivity统一拦截(传统方式)
如果项目未升级AndroidX,或更习惯在Activity中统一处理返回逻辑,可采用此方式:
在MainActivity中重写onBackPressed方法:
override fun onBackPressed() { val currentFragment = supportFragmentManager.findFragmentById(R.id.fragment_container) when (currentFragment) { // 当前是SignIn或HomeFragment时退出应用 is SignInFragment, is HomeFragment -> { finishAffinity() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { finishAndRemoveTask() } } // 其他Fragment按默认逻辑处理(比如回退到上一个Fragment) else -> super.onBackPressed() } }
注意事项
- 测试时需确认:SignUpFragment按返回键正常回退到SignInFragment,SignIn和HomeFragment按返回键直接退出应用。
- 若应用存在多任务栈场景,需额外处理,但绝大多数单任务栈应用用
finishAffinity()即可满足需求。
内容的提问来源于stack exchange,提问作者Ttm Châ'u
相关产品推荐
相关产品推荐

