Android状态栏白底黑字的示例代码
之前公司项目ui改版的时候,把大部分标题栏都设计成了白色,给我们的设计图是这个样子的:
设计图.png
这状态栏布局和图标挺像android,但是这白底黑字android设计规范里可没有啊,于是我们开发的时候果断忽视这个状态栏了(当时大部分用户还都是android 4.4)。
结果设计师拿着测试版过来问,你们安卓这个状态栏颜色怎么没改啊。
我:这个做不了。
设计师一脸质疑。
我:android4.4以上系统版本可以修改状态栏颜色,但是只有小米的miui、魅族的flyme和android6.0以上系统可以把状态栏文字和图标换成深色,其他的系统状态栏文字都是白色的,换成浅色背景的话就看不到了。
设计师一脸懵逼不知所云。
后来看着这黑色状态栏白色标题栏实在难看,而且自己用的是miui,于是还是做了适配。
其实很多国内三方android系统都有深色状态栏字体模式,但是目前只看到了小米和魅族公开了各自的实现方法,小米的支持miui v6以上版本,魅族的支持flyme4.0以上版本。代码如下:
/** * 设置状态栏图标为深色和魅族特定的文字风格,flyme4.0以上 * 可以用来判断是否为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 activity * @param dark 是否把状态栏字体及图标颜色设置为深色 * @return boolean 成功执行返回true * */ public static boolean miuisetstatusbarlightmode(activity activity, boolean dark) { boolean result = false; window window=activity.getwindow(); 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; if (build.version.sdk_int >= build.version_codes.m) { //开发版 7.7.13 及以后版本采用了系统api,旧方法无效但不会报错,所以两个方式都要加上 if(dark){ activity.getwindow().getdecorview().setsystemuivisibility( view.system_ui_flag_layout_fullscreen| view.system_ui_flag_light_status_bar); }else { activity.getwindow().getdecorview().setsystemuivisibility(view.system_ui_flag_visible); } } }catch (exception e){ } } return result; }
miui深色状态栏字体模式.png
flyme深色状态栏字体模式.png
官方在android6.0中提供了亮色状态栏模式,配置只需一行代码:
if (build.version.sdk_int >= build.version_codes.m) { activity.getwindow().getdecorview().setsystemuivisibility( view.system_ui_flag_layout_fullscreen|view.system_ui_flag_light_status_bar); }
6.0原生深色状态栏字体模式.png
网上有关状态栏颜色设置的文章很多,下面这段代码是我用的状态栏设置工具类,算是一个总结吧。
官方在4.4版本只提供了状态栏透明的api,大家普遍采用开源库systembartint对4.4版本状态栏颜色进行设置,请各位自行下载。
在设置状态栏全透明后,整个activity布局都会上移充满整个屏幕,如果你不想让布局上移的话就需要在根布局设置
android:fitssystemwindows="true"
以下为我的状态栏设置工具类:
/** * created by 赵晨璞 */ public class statusbarutil { /** * 修改状态栏为全透明 * @param activity */ @targetapi(19) public static void transparencybar(activity activity){ if(build.version.sdk_int >= build.version_codes.lollipop) { window window = activity.getwindow(); window.clearflags(windowmanager.layoutparams.flag_translucent_status); window.getdecorview().setsystemuivisibility(view.system_ui_flag_layout_fullscreen | view.system_ui_flag_layout_stable); window.addflags(windowmanager.layoutparams.flag_draws_system_bar_backgrounds); window.setstatusbarcolor(color.transparent); } else if (build.version.sdk_int >= build.version_codes.kitkat) { window window =activity.getwindow(); window.setflags(windowmanager.layoutparams.flag_translucent_status, windowmanager.layoutparams.flag_translucent_status); } } /** * 修改状态栏颜色,支持4.4以上版本 * @param activity * @param colorid */ public static void setstatusbarcolor(activity activity,int colorid) { if (build.version.sdk_int >= build.version_codes.lollipop) { window window = activity.getwindow(); // window.addflags(windowmanager.layoutparams.flag_draws_system_bar_backgrounds); window.setstatusbarcolor(activity.getresources().getcolor(colorid)); } else if (build.version.sdk_int >= build.version_codes.kitkat) { //使用systembartint库使4.4版本状态栏变色,需要先将状态栏设置为透明 transparencybar(activity); systembartintmanager tintmanager = new systembartintmanager(activity); tintmanager.setstatusbartintenabled(true); tintmanager.setstatusbartintresource(colorid); } } /** *状态栏亮色模式,设置状态栏黑色文字、图标, * 适配4.4以上版本miuiv、flyme和6.0以上版本其他android * @param activity * @return 1:miuui 2:flyme 3:android6.0 */ public static int statusbarlightmode(activity activity){ int result=0; if (build.version.sdk_int >= build.version_codes.kitkat) { if(miuisetstatusbarlightmode(activity, true)){ result=1; }else if(flymesetstatusbarlightmode(activity.getwindow(), true)){ result=2; }else if (build.version.sdk_int >= build.version_codes.m) { activity.getwindow().getdecorview().setsystemuivisibility( view.system_ui_flag_layout_fullscreen|view.system_ui_flag_light_status_bar); result=3; } } return result; } /** * 已知系统类型时,设置状态栏黑色文字、图标。 * 适配4.4以上版本miuiv、flyme和6.0以上版本其他android * @param activity * @param type 1:miuui 2:flyme 3:android6.0 */ public static void statusbarlightmode(activity activity,int type){ if(type==1){ miuisetstatusbarlightmode(activity, true); }else if(type==2){ flymesetstatusbarlightmode(activity.getwindow(), true); }else if(type==3){ activity.getwindow().getdecorview().setsystemuivisibility( view.system_ui_flag_layout_fullscreen|view.system_ui_flag_light_status_bar); } } /** * 状态栏暗色模式,清除miui、flyme或6.0以上版本状态栏黑色文字、图标 */ public static void statusbardarkmode(activity activity,int type){ if(type==1){ miuisetstatusbarlightmode(activity, false); }else if(type==2){ flymesetstatusbarlightmode(activity.getwindow(), false); }else if(type==3){ activity.getwindow().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 activity * @param dark 是否把状态栏文字及图标颜色设置为深色 * @return boolean 成功执行返回true * */ public static boolean miuisetstatusbarlightmode(activity activity, boolean dark) { boolean result = false; window window=activity.getwindow(); 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; if (build.version.sdk_int >= build.version_codes.m) { //开发版 7.7.13 及以后版本采用了系统api,旧方法无效但不会报错,所以两个方式都要加上 if(dark){ activity.getwindow().getdecorview().setsystemuivisibility( view.system_ui_flag_layout_fullscreen| view.system_ui_flag_light_status_bar); }else { activity.getwindow().getdecorview().setsystemuivisibility(view.system_ui_flag_visible); } } }catch (exception e){ } } return result; } }
适配浅色状态栏深色字体的时候发现底层版本为android6.0.1的miui7.1系统不支持view.system_ui_flag_light_status_bar设置,还是得用miui自己的深色字体方法。
2017年7月,小米才终于想起来对状态栏字符颜色的逻辑做了一次调整,改为兼容android原生的设置方式,但是没给出怎么区分旧系统与新系统的方法==、
没办法,只能在设置miui状态栏的地方把两种方法都写上。
三方android系统对底层改的挺乱的,也是让人头痛。o__o
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。