Android Java中如何修改状态栏与导航栏颜色?新手操作遇阻
解决Android状态栏/导航栏设置颜色仅淡化的问题
嘿,我刚入门Android开发的时候也踩过一模一样的坑!你遇到的「调用setColor后只有淡化效果、没变成纯白」的情况,大概率是系统默认的半透明/沉浸模式在搞鬼,或者颜色资源本身有问题,咱们一步步来搞定:
1. 先确认你的颜色资源是完全不透明的
首先检查res/values/colors.xml里的colorWhite是不是真的纯白:
<!-- 必须是完全不透明的#FFFFFF,带透明度的比如#CCFFFFFF会显示淡化效果 --> <color name="colorWhite">#FFFFFF</color>
如果颜色本身带透明度,那不管怎么设置都会是淡的,这是最容易忽略的点!
2. 给Window设置正确的标志位(关键!)
Android 6.0(API 23)之后,状态栏颜色要完全生效,必须先清除系统默认的半透明标志,再开启「允许窗口绘制系统栏背景」的权限。把你的代码改成这样:
Window window = getWindow(); // 清除默认的半透明状态栏标志 window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); // 开启窗口绘制系统栏背景的功能,这是setColor生效的前提 window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); // 重要:如果设置白色状态栏,别忘了把状态栏文字/图标改成深色(API 23+支持) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); } // 最后设置颜色(注意:API 23+推荐用ContextCompat.getColor,兼容旧版本) window.setStatusBarColor(ContextCompat.getColor(this, R.color.colorWhite)); window.setNavigationBarColor(ContextCompat.getColor(this, R.color.colorWhite));
3. 针对Android 10+的导航栏额外处理
如果你的设备是Android 10(API 29)及以上,系统默认会给导航栏加一层半透明蒙版,需要额外关闭这个效果:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { // 强制导航栏颜色与设置的一致,关闭半透明蒙版 window.setNavigationBarContrastEnforced(true); }
4. 检查主题配置有没有冲突
最后看看你的Activity主题(在styles.xml里)有没有设置以下属性,如果有,一定要删掉:
<!-- 这个属性会让状态栏变成半透明,覆盖你的setColor设置 --> <item name="android:windowTranslucentStatus">true</item> <item name="android:windowTranslucentNavigation">true</item>
按照上面的步骤改完,状态栏和导航栏应该就能完全变成纯白色啦!
内容的提问来源于stack exchange,提问作者Luis Miguel Molina Betancourt
相关产品推荐
相关产品推荐

