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

Android 13下Cordova应用状态栏透明且导航栏设指定颜色的问题

Android 13下Cordova实现状态栏透明+导航栏指定颜色的解决方案

核心修改步骤(在CordovaActivity.java中调整)

要同时实现状态栏透明、导航栏自定义颜色,且WebView不被系统栏遮挡,需要正确配置Window属性并处理WindowInsets,避免设置冲突。

完整代码示例

import android.os.Build;
import android.view.Window;
import android.view.WindowManager;
import androidx.core.view.WindowCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.core.view.ViewCompat;
import android.graphics.Color;

// 在CordovaActivity的onCreate方法中添加以下代码
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Window window = getWindow();

    // 1. 配置状态栏透明
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        // Android 11+ 禁用系统栏自动适配布局
        WindowCompat.setDecorFitsSystemWindows(window, false);
        // 可选:若状态栏文字需浅色(适配深色背景),取消下方注释
        // window.getInsetsController().setSystemBarsAppearance(
        //     WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS,
        //     WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS
        // );
    } else {
        // 低版本兼容(最低SDK低于30时使用)
        window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        window.getDecorView().setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
            View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
        );
    }

    // 2. 设置导航栏为指定颜色(示例为红色,替换为你需要的颜色值)
    window.setNavigationBarColor(Color.RED);
    // 可选:若导航栏图标需浅色(Android 10+),取消下方注释
    // if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    //     window.setNavigationBarContrastEnforced(false);
    //     window.getInsetsController().setSystemBarsAppearance(
    //         WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS,
    //         WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS
    //     );
    // }

    // 3. 处理WindowInsets,确保WebView内容不被系统栏遮挡
    ViewCompat.setOnApplyWindowInsetsListener(window.getDecorView(), (v, insets) -> {
        // 获取状态栏和导航栏的内边距值
        int statusBarTop = insets.getInsets(WindowInsetsCompat.Type.statusBars()).top;
        int navBarBottom = insets.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom;
        
        // 给根布局设置内边距,让内容避开状态栏和导航栏
        v.setPadding(0, statusBarTop, 0, navBarBottom);
        
        return insets;
    });
}

问题原因说明

你之前的代码存在两个关键问题:

  1. 仅设置了底部导航栏的内边距,未处理状态栏内边距,可能导致WebView内容仍被状态栏覆盖;
  2. 导航栏颜色失效是因为WindowCompat.setDecorFitsSystemWindows(window, false)调用后,若导航栏颜色设置顺序错误,或存在FLAG_TRANSLUCENT_NAVIGATION这类冲突标志,会导致颜色不生效。

辅助配置(可选,通过config.xml补充)

在项目的config.xml中添加以下偏好设置,可与代码设置形成互补:

<!-- 允许状态栏覆盖WebView -->
<preference name="StatusBarOverlaysWebView" value="true" />
<!-- 透明状态栏 -->
<preference name="StatusBarBackgroundColor" value="#00000000" />
<!-- 导航栏颜色(需与代码中设置一致) -->
<preference name="NavigationBarColor" value="#FF0000" />

内容的提问来源于stack exchange,提问作者Alejandro Rodriguez Sen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 21:58:25