You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 04:45:58