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

如何设置应用透明状态栏且保留不透明导航栏?

实现仅透明状态栏、保留黑色导航栏的方案

这个需求我之前做项目的时候也遇到过,确实不能直接用你提到的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:29:56