移动开发

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。


📌 预测性返回的测试方法

  1. 使用 Android Studio Giraffe 或 Hedgehog 以上版本的模拟器。
  2. 模拟器需运行 Android 14(API 34)。
  3. 在设置中开启预测性返回动画: Settings > System > Developer options > Predictive back animations。

🚫 常见问题

  • 动画不生效? → 检查是否在 Android 14 模拟器上运行。
  • Fragment 不响应返回手势? → 检查是否正确设置了 enableOnBackInvokedCallback。
  • 使用 Compose? → Compose 的 BottomSheet 使用的是不同的实现,需要单独处理。

留言

您的邮箱地址不会被公开。 必填项已用 * 标注