Android 15+如何保留状态栏空间?避免内容与状态栏重叠
Android 15中
enableEdgeToEdge()下保留状态栏偏移的简化实现 Android 15推荐使用enableEdgeToEdge()实现全屏边缘到边缘效果,但调用后会移除状态栏的顶部偏移,导致主内容和状态栏重叠。我们的需求是让状态栏保持透明,同时内容在状态栏下方正常渲染(即保留状态栏高度的顶部偏移)。
你当前的实现虽然可行,但代码冗余且只处理一次偏移,遇到状态栏高度变化(比如折叠屏切换、全屏模式切换)时会失效。下面是几种更简便且鲁棒的方案:
方案一:用ViewCompat统一兼容各版本
直接给目标容器设置WindowInsets监听,借助Jetpack的ViewCompat自动处理版本兼容,无需手动判断SDK:
// 在MainActivity.onCreate()中 enableEdgeToEdge() // 获取Fragment容器 val container = binding.root.findViewById<FragmentContainerView>(R.id.nav_host_fragment_activity_main) // 给容器设置Insets监听 ViewCompat.setOnApplyWindowInsetsListener(container) { view, insets -> // 获取状态栏Insets高度 val statusBarHeight = insets.getInsets(WindowInsetsCompat.Type.statusBars()).top // 设置容器的顶部Margin val params = view.layoutParams as ViewGroup.MarginLayoutParams params.topMargin = statusBarHeight view.layoutParams = params // 返回Insets供其他View使用 insets }
优势:
- 自动兼容所有Android版本,不用写SDK版本判断逻辑
- 每次状态栏Insets变化时都会自动更新偏移,适配折叠屏、全屏切换等场景
- 代码更简洁,直接针对目标View处理,无需全局DecorView监听和标记位
方案二:布局中直接使用系统属性(静态适配)
如果你的场景中状态栏高度不会动态变化,可以直接在布局文件给Fragment容器设置顶部padding:
<FragmentContainerView android:id="@+id/nav_host_fragment_activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingTop="?android:attr/statusBarHeight" />
注意:
- 这种方式是静态取值,无法适配状态栏高度动态变化的场景(比如折叠屏、沉浸式切换)
- 需要确保
enableEdgeToEdge()已经调用,状态栏是透明状态
内容的提问来源于stack exchange,提问作者aj3423
相关产品推荐
相关产品推荐

