material3 中的BottomSheetDialogFragment 如何实现预测性返回?
在 Material3 中,BottomSheetDialogFragment(通常继承自 com.google.android.material.bottomsheet.BottomSheetDialogFragment)默认是支持预测性返回(Predictive Back)的,但要让它真正与 Android 14(API 34)上的预测性返回动画协作良好,还需要确保几个关键点都满足。
下面是实现预测性返回的具体步骤和注意事项:
✅ 1. 使用支持预测性返回的 Android 版本
预测性返回动画是从 Android 13(部分支持)和 Android 14(全面支持)开始引入的,所以要测试它需要运行在 Android 14+ 的设备或模拟器上。
✅ 2. 使用 Material3 和最新依赖
确保你的 material 组件库是 1.9.0 以上版本(推荐使用最新):
implementation "com.google.android.material:material:1.11.0" // 或更高版本
✅ 3. 为 BottomSheetDialogFragment 设置合适的 theme
Material3 的 BottomSheet 默认已经集成了预测性返回支持,但你要确保它使用的是 Material3 主题,比如:
<style name="AppTheme.BottomSheetDialog" parent="Theme.Material3.DayNight.BottomSheetDialog"> <!-- 自定义你的样式 --> </style>
在 Fragment 中使用:
override fun getTheme(): Int { return R.style.AppTheme_BottomSheetDialog }
✅ 4. 启用 Activity 级别的预测性返回支持
确保你的 Activity 开启了这个特性:
AndroidManifest.xml 中设置:
<application android:enableOnBackInvokedCallback="true" ... >
或者单独在 Activity 上设置:
<activity android:enableOnBackInvokedCallback="true" ... />
✅ 5. 实现预测性返回回调(可选)
从 Android 13(API 33)起,可以通过 OnBackInvokedDispatcher 注册返回事件回调:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { requireActivity().onBackInvokedDispatcher.registerOnBackInvokedCallback( OnBackInvokedDispatcher.PRIORITY_DEFAULT ) { // 关闭 bottom sheet 或自定义返回逻辑 dismiss() } }
这个通常不需要写,除非你有自定义的返回处理逻辑。
✅ 6. 适配 Navigation Component(如有)
如果你使用 Jetpack Navigation 来管理 Fragment 栈,也需要让 Navigation 支持 OnBackPressedDispatcher 或 OnBackInvokedDispatcher。
📌 预测性返回的测试方法
- 使用 Android Studio Giraffe 或 Hedgehog 以上版本的模拟器。
- 模拟器需运行 Android 14(API 34)。
- 在设置中开启预测性返回动画: Settings > System > Developer options > Predictive back animations。
🚫 常见问题
- 动画不生效? → 检查是否在 Android 14 模拟器上运行。
- Fragment 不响应返回手势? → 检查是否正确设置了 enableOnBackInvokedCallback。
- 使用 Compose? → Compose 的 BottomSheet 使用的是不同的实现,需要单独处理。