当前位置: 移动技术网 > 移动技术>移动开发>Android > Android状态栏白底黑字的示例代码

Android状态栏白底黑字的示例代码

2019年07月24日  | 移动技术网移动技术  | 我要评论

之前公司项目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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网