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

相关推荐
Wenweno0o1 天前
0基础Go语言Eino框架智能体实战-chatModel
开发语言·后端·golang
chenjingming6661 天前
jmeter线程组设置以及串行和并行设置
java·开发语言·jmeter
BoomHe1 天前
Android AOSP13 原生 Launcher3 壁纸获取方式
android
cch89181 天前
Python主流框架全解析
开发语言·python
不爱吃炸鸡柳1 天前
C++ STL list 超详细解析:从接口使用到模拟实现
开发语言·c++·list
十五年专注C++开发1 天前
RTTR: 一款MIT 协议开源的 C++ 运行时反射库
开发语言·c++·反射
Momentary_SixthSense1 天前
设计模式之工厂模式
java·开发语言·设计模式
‎ദ്ദിᵔ.˛.ᵔ₎1 天前
STL 栈 队列
开发语言·c++
勿忘,瞬间1 天前
数据结构—顺序表
java·开发语言
张張4081 天前
(域格)环境搭建和编译
c语言·开发语言·python·ai