如何实现布局延伸至状态栏且不覆盖系统导航栏(无深色背景)
实现布局延伸至透明状态栏但保留底部导航栏内边距
第一步:配置透明状态栏(无深色背景)
在你的App主题(res/values/styles.xml 或针对高版本的values-v21/styles.xml)中添加以下属性,替代android:windowTranslucentStatus:
<item name="android:statusBarColor">@android:color/transparent</item> <item name="android:windowDrawsSystemBarBackgrounds">true</item> <!-- 可选:根据布局背景色设置状态栏图标颜色,true为浅色图标,false为深色 --> <item name="android:windowLightStatusBar">true</item>
这个配置能让状态栏完全透明,不会自带半深色背景,同时允许布局延伸到状态栏下方。
第二步:控制布局范围,保留底部导航栏内边距
先调用WindowCompat.setDecorFitsSystemWindows让布局能延伸到状态栏区域,再手动给根布局添加底部导航栏高度的内边距,避免内容被底部导航栏遮挡:
Kotlin 代码示例:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 允许布局延伸至系统栏区域 WindowCompat.setDecorFitsSystemWindows(window, false) // 获取底部导航栏的高度 val navBarHeight = resources.getIdentifier("navigation_bar_height", "dimen", "android").takeIf { it > 0 } ?.let { resources.getDimensionPixelSize(it) } ?: 0 // 给根布局设置底部内边距 val rootView = findViewById<View>(android.R.id.content) rootView.setPadding(0, 0, 0, navBarHeight) }
Java 代码示例:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 允许布局延伸至系统栏区域 WindowCompat.setDecorFitsSystemWindows(getWindow(), false); // 获取底部导航栏的高度 int navBarHeight = 0; int resourceId = getResources().getIdentifier("navigation_bar_height", "dimen", "android"); if (resourceId > 0) { navBarHeight = getResources().getDimensionPixelSize(resourceId); } // 给根布局设置底部内边距 View rootView = findViewById(android.R.id.content); rootView.setPadding(0, 0, 0, navBarHeight); }
关键说明
WindowCompat.setDecorFitsSystemWindows(window, false)会移除系统自动给布局添加的所有内边距,让布局可以铺满全屏;我们手动只补上底部导航栏的内边距,就能实现布局延伸到状态栏下方,但不被底部导航栏覆盖的效果。- 不要使用
android:windowTranslucentStatus,该属性会强制给状态栏添加半透明深色背景,不符合你的需求。
内容的提问来源于stack exchange,提问作者user924
相关产品推荐
相关产品推荐

