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; }); }
问题原因说明
你之前的代码存在两个关键问题:
- 仅设置了底部导航栏的内边距,未处理状态栏内边距,可能导致WebView内容仍被状态栏覆盖;
- 导航栏颜色失效是因为
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
相关产品推荐
相关产品推荐

