Android实现edge-to-edge效果时隐藏status bar的正确方案咨询
Android Edge-to-edge模式下隐藏状态栏的正确实现方案
第一步:修正主题配置
- 首先移除原有
<item name="android:windowFullscreen">true</item>配置,该属性会强制应用内容避开系统栏区域,与edge-to-edge的全屏布局逻辑完全冲突,是之前内容被下推的核心原因。 - 在应用的Activity主题中添加以下配置:
<!-- 状态栏设为透明,保证布局可以延伸到该区域 --> <item name="android:statusBarColor">@android:color/transparent</item> <!-- 适配挖孔/刘海屏,允许内容延伸到挖孔区域 --> <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
第二步:Activity代码中配置窗口属性
在Activity的onCreate方法setContentView之前添加以下配置,同时兼容高低版本系统:
// 开启基础edge-to-edge适配(AndroidX Core 1.5+ 自带API) EdgeToEdge.enable(this) // 隐藏状态栏,同时允许滑动临时调出状态栏 WindowCompat.getInsetsController(window, window.decorView).run { hide(WindowInsetsCompat.Type.statusBars()) // 滑动调出的状态栏会自动隐藏,不会持续遮挡内容 systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE } // 兼容Android 10及以下版本的配置 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) { window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_FULLSCREEN) }
第三步:适配布局,支持在原状态栏区域放置可点击控件
给根布局设置Insets监听,拿到状态栏高度后自定义对应区域的布局参数,示例代码如下:
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.root_layout)) { _, insets -> // 获取原状态栏区域的高度 val statusBarHeight = insets.getInsets(WindowInsetsCompat.Type.statusBars()).top // 示例:给顶部自定义按钮容器设置等于状态栏高度的top padding,或者直接设置容器高度 val topButtonContainer = findViewById<View>(R.id.top_action_container) topButtonContainer.setPadding(0, statusBarHeight, 0, 0) // 也可以直接设置容器高度为statusBarHeight,直接在该区域放置按钮 // topButtonContainer.layoutParams.height = statusBarHeight topButtonContainer.requestLayout() // 不消费Insets,继续传递给子视图 insets }
做完以上三步后,应用内容会完全铺满整个屏幕,原状态栏区域可以正常放置按钮等可交互控件,不会出现内容被下推的问题。
内容的提问来源于stack exchange,提问作者Son of Stackoverflow
相关产品推荐
相关产品推荐

