如何设置应用透明状态栏且保留不透明导航栏?
实现仅透明状态栏、保留黑色导航栏的方案
这个需求我之前做项目的时候也遇到过,确实不能直接用你提到的FLAG_LAYOUT_NO_LIMITS(会让导航栏也透明)或者windowTranslucentStatus(只能半透明),得结合主题配置和代码设置来实现,分Android版本处理更稳妥:
一、主题配置(styles.xml)
先在你的主题里定义相关属性,针对不同API版本做适配:
<style name="AppTheme.TransparentStatus" parent="Theme.AppCompat.Light.NoActionBar"> <!-- API 21+ 配置:状态栏透明、导航栏固定黑色 --> <item name="android:statusBarColor">@android:color/transparent</item> <item name="android:windowDrawsSystemBarBackgrounds">true</item> <item name="android:navigationBarColor">@android:color/black</item> <!-- API 19-20 配置:仅开启状态栏半透明,关闭导航栏半透明 --> <item name="android:windowTranslucentStatus">true</item> <item name="android:windowTranslucentNavigation">false</item> </style>
提示:记得在AndroidManifest.xml里给目标Activity指定这个主题
二、Activity代码适配
在Activity的onCreate方法中(建议在setContentView之后)添加以下代码,针对不同版本做精确控制:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Window window = getWindow(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // 允许布局内容延伸到状态栏下方 window.getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); // 强制设置状态栏透明、导航栏黑色 window.setStatusBarColor(Color.TRANSPARENT); window.setNavigationBarColor(Color.BLACK); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { // Android 4.4 仅支持状态栏半透明,这里开启状态栏半透明并关闭导航栏半透明 window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); } }
三、布局注意事项
要让你的页面背景真正延伸到状态栏下方,需要给根布局设置:
android:fitsSystemWindows="false"
如果某些子View(比如顶部标题栏)不想被状态栏遮挡,可以单独给这些View设置android:fitsSystemWindows="true",或者通过代码动态添加顶部padding:
// 获取状态栏高度并设置padding private void setStatusBarPadding(View view) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { int statusBarHeight = getResources().getDimensionPixelSize(resourceId); view.setPadding(0, statusBarHeight, 0, 0); } } }
关键细节说明
- 为什么不用
FLAG_LAYOUT_NO_LIMITS?这个Flag会让布局同时延伸到导航栏下方,导致导航栏变成透明(内容会覆盖导航栏),完全不符合需求。 - Android 4.4(API19)限制:这个版本没有真正的完全透明状态栏,只能实现半透明效果,这是系统层面的限制,无法绕过。
内容的提问来源于stack exchange,提问作者Elliptica
相关产品推荐
相关产品推荐

