简介
从 Android 13
(API level 33)开始,onBackPressed
已弃用,后退事件处理正在转向提前模型(ahead-of-time model),并且不应使用 Activity#onBackPressed()
和 KeyEvent#KEYCODE_BACK
来处理后退事件(后退手势或后退按钮的单击)。应使用 Activity#getOnBackInvokedDispatcher() .registerOnBackInvokedCallback(priority, callback)
注册 OnBackInvokedCallback
。
如果将应用程序更新到 API level 33,代码中会看到此错误:'onBackPressed(): Unit' is deprecated. Overrides deprecated member in 'androidx.core.app.ComponentActivity'. Deprecated in Java
如果无法使用 AndroidX 还提供了其他选项用于处理此功能:
使用 AndroidX API 实现预测性返回手势
如需支持预测性返回手势,您需要使用 OnBackPressedCallback AppCompat 1.6.0-alpha05 (AndroidX) 或更高版本的 API,或使用新的 OnBackInvokedCallback API level 33 平台 API。
1. 在项目中添加所需的依赖项
dependencies {
// 添加 1.6.0-alpha05 或更高版本
implementation "androidx.activity:activity:1.6.0-alpha05"
2. 启用预测性“返回”手势
在 AndroidManifest.xml 中将 enableOnBackInvokedCallback
设置为 true
<application
...
android:enableOnBackInvokedCallback="true" // Enables this feature.
... >
...
</application>
3. 声明并注册 OnBackPressedCallback
来处理返回手势
-
处理 Activity
中的返回手势
fun AppCompatActivity.onBackPressed(isEnabled: Boolean, callback: () -> Unit) {
onBackPressedDispatcher.addCallback(this,
object : OnBackPressedCallback(isEnabled) {
override fun handleOnBackPressed() {
callback()
}
})
}
class ExampleActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_example)
onBackPressed(true) {
// TODO
}
}
}
-
处理 Fragment
中的返回手势
fun FragmentActivity.onBackPressed(callback: () -> Unit) {
onBackPressedDispatcher.addCallback(this,
object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
callback()
}
}
)
}
class ExampleFragment : Fragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
requireActivity().onBackPressed {
// TODO
}
}
}
4. 测试预测性返回手势动画
从 Android 13 最终版本开始,能够通过启用一个开发者选项来测试返回主屏幕动画。
- 打开 设置 > 系统 > 开发者选项。
- 选择预测性返回手势动画。
- 启动更新后的应用,然后执行返回手势,看看实际运行效果。
如果其他不清楚的地方参加官方文档和 Codlabs 示例:
https://developer.android.com/guide/navigation/predictive-back-gesture
https://codelabs.developers.google.com/handling-gesture-back-navigation