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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:37:27