Android回退按钮处理方法总结

引言

1. Activity 级别的回退处理

方法一:重写 onBackPressed()

Kotlin 复制代码
@Override
public void onBackPressed() {
    if (shouldCustomHandleBack) {
        // 自定义回退逻辑
        handleCustomBackAction();
    } else {
        // 默认行为
        super.onBackPressed();
    }
}

方法二:使用 onBackPressedDispatcher(推荐)

Kotlin 复制代码
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                if (shouldInterceptBackPress) {
                    // 拦截回退事件
                    showExitConfirmation()
                } else {
                    // 允许默认行为
                    isEnabled = false
                    onBackPressed()
                }
            }
        })
    }
}

用的时候发现,官方已经onBackPressed 废弃了。

现在推荐这样处理"返回":在 Activity 里 用 OnBackPressedDispatcher + OnBackPressedCallback。

正文

在 Activity 里

用 OnBackPressedDispatcher + OnBackPressedCallback。

Kotlin 复制代码
class MainActivity : AppCompatActivity() {

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    onBackPressedDispatcher.addCallback(this,
      object : OnBackPressedCallback(true) {
        override fun handleOnBackPressed() {
          // TODO: 自定义返回逻辑
          // e.g. 先关闭抽屉/弹窗,否则再退出
          finish()
        }
      }
    )
  }
}

如果你只是想"触发默认返回",调用:

onBackPressedDispatcher.onBackPressed()

在 Fragment 里

用 viewLifecycleOwner 绑定生命周期(避免内存泄露):

Kotlin 复制代码
class DemoFragment : Fragment(R.layout.fragment_demo) {
  override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    requireActivity().onBackPressedDispatcher.addCallback(
      viewLifecycleOwner,
      object : OnBackPressedCallback(true) {
        override fun handleOnBackPressed() {
          // TODO: Fragment 内自定义返回
          // 例如先消费一次返回,不想消费时可以:
          // isEnabled = false
          // requireActivity().onBackPressedDispatcher.onBackPressed()
        }
      }
    )
  }
}

如果用了 NavController,一般无需手动拦截:

// Toolbar 左上角返回键

toolbar.setNavigationOnClickListener { navController.navigateUp() }

想自定义时,再用上面的 OnBackPressedCallback 协调。

Jetpack Compose

用 androidx.activity.compose.BackHandler:

Kotlin 复制代码
BackHandler(enabled = true) {
  // 自定义返回
}

小结

  • 不要再重写 onBackPressed()。

  • 首选 OnBackPressedDispatcher + OnBackPressedCallback(Activity/Fragment/Compose 都有对应做法)。

  • 用 Navigation 时,默认就支持返回;需要拦截再加 Callback。

  • Android 13+ 若要玩预测性返回的高级用法,再考虑 OnBackInvokedCallback。

相关推荐
临床数据科学和人工智能兴趣组31 分钟前
正则表达式的基础语法的基本符号
开发语言·人工智能·python·正则表达式·r语言·r语言-4.2.1·workbudyy
王中阳Go35 分钟前
Go 后端转 AI:非科班怎么补?一张 3 列路线表(可保存)
开发语言·人工智能·后端·python·golang·大语言模型
geats人山人海1 小时前
java 4继承
java·开发语言
aqiu1111111 小时前
【C++算法打怪专栏】C++ `unordered_set` 常用初始化与插入方法总结
开发语言·c++·算法
众链网络1 小时前
Agent 的成本大头不在“写“,在“判断“:拆解专用决策模型的三层架构
java·开发语言·人工智能·微服务
周小董1 小时前
[1371]jdk管理工具
java·开发语言
Terra.K1 小时前
高精度阶乘求和模板深度解析
开发语言·c++·算法
Hum8le2 小时前
漏洞知识点《php伪协议》
开发语言·安全·web安全·php
青春逝如流水2 小时前
Java 中线程的创建方式:从基础到现代
java·开发语言·多线程·ai文章
智码看视界2 小时前
C++智能指针全景剖析及面试20问
开发语言·c++·深度学习·面试·内存管理·智能指针