前言:

Android开发,对于状态栏的修改,实在是不友好,没什么api可以用,不像ios那么方便.但是ui又喜欢只搞ios一套.没办法.各种翻源码,写反射.真的蛋疼.
需求场景:
当toolbar及状态栏需要为白色或浅色时(如简书),状态栏由于用的Light风格Theme,字体,图标也都是白色,会看不清.如果改变成黑色就很和谐了.
一.修改状态栏颜色:
改变状态栏颜色,可以看看这篇文章.传送门:实现状态栏(statusbar)渐变效果其实很简单
传送门实现的效果:
这种方法实现的状态栏变色,没有黑色背景.
使用全屏模式实现的效果如下(QQ的效果):
很明显的黑色背景.
我用的手机是华为,系统7.0
二.修改状态栏字体:
通用工具类:
public class StatusBarUtil {
/**
* 设置状态栏黑色字体图标,
* 适配4.4以上版本MIUIV、Flyme和6.0以上版本其他Android
*
* @return 1:MIUUI 2:Flyme 3:android6.0
*/
public static int getStatusBarLightMode(Window window) {
int result = 0;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (MIUISetStatusBarLightMode(window, true)) {
result = 1;
} else if (FlymeSetStatusBarLightMode(window, true)) {
result = 2;
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
result = 3;
} else {//5.0
}
}
return result;
}
/**
* 已知系统类型时,设置状态栏黑色字体图标。
* 适配4.4以上版本MIUIV、Flyme和6.0以上版本其他Android
*/
public static void setStatusBarLightMode(Window window) {
int type = getStatusBarLightMode(window);
if (type == 1) {
MIUISetStatusBarLightMode(window, true);
} else if (type == 2) {
FlymeSetStatusBarLightMode(window, true);
} else if (type == 3) {
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
} else {//5.0
}
}
/**
* 清除MIUI或flyme或6.0以上版本状态栏黑色字体
*/
public static void StatusBarDarkMode(Window window) {
int type = getStatusBarLightMode(window);
if (type == 1) {
MIUISetStatusBarLightMode(window, false);
} else if (type == 2) {
FlymeSetStatusBarLightMode(window, false);
} else if (type == 3) {
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
}
}
/**
* 设置状态栏图标为深色和魅族特定的文字风格
* 可以用来判断是否为Flyme用户
*
* @param window 需要设置的窗口
* @param dark 是否把状态栏字体及图标颜色设置为深色
* @return boolean 成功执行返回true
*/
public static boolean FlymeSetStatusBarLightMode(Window window, boolean dark) {
boolean result = false;
if (window != null) {
try {
WindowManager.LayoutParams lp = window.getAttributes();
Field darkFlag = WindowManager.LayoutParams.class
.getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");
Field meizuFlags = WindowManager.LayoutParams.class
.getDeclaredField("meizuFlags");
darkFlag.setAccessible(true);
meizuFlags.setAccessible(true);
int bit = darkFlag.getInt(null);
int value = meizuFlags.getInt(lp);
if (dark) {
value |= bit;
} else {
value &= ~bit;
}
meizuFlags.setInt(lp, value);
window.setAttributes(lp);
result = true;
} catch (Exception e) {
}
}
return result;
}
/**
* 设置状态栏字体图标为深色,需要MIUIV6以上
*
* @param window 需要设置的窗口
* @param dark 是否把状态栏字体及图标颜色设置为深色
* @return boolean 成功执行返回true
*/
public static boolean MIUISetStatusBarLightMode(Window window, boolean dark) {
boolean result = false;
if (window != null) {
Class clazz = window.getClass();
try {
int darkModeFlag = 0;
Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
darkModeFlag = field.getInt(layoutParams);
Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
if (dark) {
extraFlagField.invoke(window, darkModeFlag, darkModeFlag);//状态栏透明且黑色字体
} else {
extraFlagField.invoke(window, 0, darkModeFlag);//清除黑色字体
}
result = true;
} catch (Exception e) {
}
}
return result;
}
}
activity中使用:
StatusBarUtil.setStatusBarLightMode(getWindow());
效果:
出现的问题:
1.statusbar背景色变成了colorPrimaryDark默认颜色,但是我的配置是白色背景(具体配置代码见最后).
分析原因:
setSystemUiVisibility()会刷新view的属性配置.由于statusbar默认使用colorPrimaryDark属性.所以颜色会变回默认颜色
此时步骤一设置背景的方法就会失效.
private void initStatusBar() {
if (statusBarView == null) {
int identifier = getResources().getIdentifier("statusBarBackground", "id", "android");
statusBarView = getWindow().findViewById(identifier);
}
if (statusBarView != null) {
statusBarView.setBackgroundResource(MVPConfig.statusDrawable);
}
}
原因:当传入的resid相同时,就不会再次去设置背景色.
解决办法:
private void initStatusBar() {
if (statusBarView == null) {
int identifier = getResources().getIdentifier("statusBarBackground", "id", "android");
statusBarView = getWindow().findViewById(identifier);
}
if (statusBarView != null) {
statusBarView.setBackgroundDrawable(null);//在设置前将背景设置为null;
statusBarView.setBackgroundResource(MVPConfig.statusDrawable);
}
}
修改后的效果:
三.完整代码:
1.MvpConfig
public class MVPConfig {
public static int statusDrawable;
public static int toolbarBackgroundColor;
public static int toolbarBackgroundDrawable;
public static int backDrawable;
public static boolean isStatusBarLight;
public static void setStatusbarDrawable(@DrawableRes int statusDraw) {
statusDrawable = statusDraw;
}
public static boolean isStatusBar() {
return statusDrawable > 0;
}
public static void setToolbarDrawable(int toolbarBackgroundDrawable) {
MVPConfig.toolbarBackgroundDrawable = toolbarBackgroundDrawable;
}
public static void setBackDrawable(int backDrawable) {
MVPConfig.backDrawable = backDrawable;
}
public static void setIsStatusBarLight(boolean isStatusBarLight) {
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1) {
MVPConfig.statusDrawable = Color.parseColor("#33ffffff");
}
MVPConfig.isStatusBarLight = isStatusBarLight;
}
2.Application中
@Override
public void onCreate() {
super.onCreate();
MVPConfig.setToolbarDrawable(R.color.white);
MVPConfig.setStatusbarDrawable(R.color.white);
MVPConfig.setBackDrawable(R.drawable.back);
MVPConfig.setIsStatusBarLight(true);
}
3.BaseActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//延时加载数据.
Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() {
@Override
public boolean queueIdle() {
if (isStatusBarLight()) {
StatusBarUtil.setStatusBarLightMode(getWindow());
}
if (isStatusBar()) {
initStatusBar();
getWindow().getDecorView().addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
initStatusBar();
}
});
}
mPresenter.initData();
return false;
}
});
}
private void initStatusBar() {
if (statusBarView == null) {
int identifier = getResources().getIdentifier("statusBarBackground", "id", "android");
statusBarView = getWindow().findViewById(identifier);
}
if (statusBarView != null) {
if (isStatusBarLight()) {
statusBarView.setBackgroundDrawable(null);
}
statusBarView.setBackgroundResource(MVPConfig.statusDrawable);
}
}
//子类通过复写该方法,控制是否改变statusbar
protected boolean isStatusBar() {
return MVPConfig.isStatusBar();
}
//子类通过复写该方法,控制是否需要改变statusbar字体颜色
protected boolean isStatusBarLight() {
return MVPConfig.isStatusBarLight;
}
四.补充:
6.0以下,5.0原生系统无法修改字体颜色,用了个比较取巧的办法,设置成半透明灰色.
public static void setStatusBarLightMode(Window window) {
int type = getStatusBarLightMode(window);
if (type == 1) {
MIUISetStatusBarLightMode(window, true);
} else if (type == 2) {
FlymeSetStatusBarLightMode(window, true);
} else if (type == 3) {
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
} else {
//5.0
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1) {
MVPConfig.statusDrawable = Color.parseColor("#33ffffff");
}
}
}
由于是直接修改window中的statusbarview的背景,而frgament依赖于activity,所以在activity与fragment直接跳转时,状态栏不是很适用.比如:activity是蓝色,fragment需要是白色,fragment需要通过window修改状态栏颜色.有点麻烦.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Android状态栏字体颜色
# Android修改状态栏背景
# Android
# 修改状态栏字体颜色
# Android 8.1隐藏状态栏图标的实例代码
# android开发修改状态栏背景色和图标颜色的示例
# android实现状态栏添加图标的函数实例
# Android应用图标在状态栏上显示实现原理
# Android系统状态栏定制图标显示逻辑控制
# 状态栏
# 设置为
# 子类
# 背景色
# 都是
# 华为
# 传送门
# 就会
# 可以用
# 不是很
# 没办法
# 我用
# 用了
# 不像
# 跳转
# 这篇文章
# 很明显
# 全屏
# 解决办法
# 前将
相关文章:
建站之星北京办公室:智能建站系统与小程序生成方案解析
C++如何编写函数模板?(泛型编程入门)
如何续费美橙建站之星域名及服务?
如何通过虚拟机搭建网站?详细步骤解析
可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?
如何在局域网内绑定自建网站域名?
如何零基础在云服务器搭建WordPress站点?
香港服务器部署网站为何提示未备案?
网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
如何用美橙互联一键搭建多站合一网站?
如何通过主机屋免费建站教程十分钟搭建网站?
5种Android数据存储方式汇总
建站上市公司网站建设方案与SEO优化服务定制指南
香港服务器网站推广:SEO优化与外贸独立站搭建策略
七夕网站制作视频,七夕大促活动怎么报名?
,南京靠谱的征婚网站?
如何在Golang中指定模块版本_使用go.mod控制版本号
已有域名建站全流程解析:网站搭建步骤与建站工具选择
视频网站app制作软件,有什么好的视频聊天网站或者软件?
,网站推广常用方法?
哈尔滨网站建设策划,哈尔滨电工证查询网站?
怀化网站制作公司,怀化新生儿上户网上办理流程?
如何快速生成ASP一键建站模板并优化安全性?
安云自助建站系统如何快速提升SEO排名?
在线制作视频网站免费,都有哪些好的动漫网站?
深圳 网站制作,深圳招聘网站哪个比较好一点啊?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
如何确保FTP站点访问权限与数据传输安全?
微信小程序制作网站有哪些,微信小程序需要做网站吗?
网站按钮制作软件,如何实现网页中按钮的自动点击?
制作网站的公司有哪些,做一个公司网站要多少钱?
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
如何在万网ECS上快速搭建专属网站?
宿州网站制作公司兴策,安徽省低保查询网站?
如何用花生壳三步快速搭建专属网站?
实现点击下箭头变上箭头来回切换的两种方法【推荐】
如何在Windows 2008云服务器安全搭建网站?
如何快速搭建高效WAP手机网站吸引移动用户?
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
宝塔建站助手安装配置与建站模板使用全流程解析
高端网站建设与定制开发一站式解决方案 中企动力
建站主机系统SEO优化与智能配置核心关键词操作指南
网站图片在线制作软件,怎么在图片上做链接?
非常酷的网站设计制作软件,酷培ai教育官方网站?
网站制作话术技巧,网站推广做的好怎么话术?
成都响应式网站开发,dw怎么把手机适应页面变成网页?
如何优化Golang Web性能_Golang HTTP服务器性能提升方法
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
宝塔新建站点报错如何解决?
*请认真填写需求信息,我们会在24小时内与您取得联系。