下面的代码是基于开源项目SystemBarTint,我们需要添加其依赖

  1. compile 'com.readystatesoftware.systembartint:systembartint:1.0.3'

下面的代码,我在类原生的Android7.0系统测试通过,其他的国产ROM系统未进行测试

设置状态栏白色

1. 设置主题theme

在AndroidManifest文件中,设置theme

按住Ctrl,点开那个theme,修改theme

2. 设置xml文件

之后在xml文件中的根节点,添加属性android:fitsSystemWindows="true",同时,把背景颜色设置为白色(这一步背景色可以不设置,我的项目整体是白色的,看你需求)

3. 添加代码

下面的是把状态栏设置为白色,字体和图标颜色设置为黑色的代码,复制一份,之后Activity对应的java文件中的setContentView之前调用setWhiteBar(this)方法即可

我是把下面的代码封装到了一个状态栏工具类,之后调用

  1. public static void setWhiteBar(Activity activity) {
  2. //设置状态栏为全透明
  3. transparencyBar(activity);
  4. //设置状态栏为白色
  5. SystemBarTintManager tintManager = new SystemBarTintManager(activity);
  6. tintManager.setStatusBarTintEnabled(true);
  7. tintManager.setStatusBarTintResource(R.color.color_white);
  8. //设置状态栏字体和图标为黑色
  9. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
  10. activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
  11. }
  12. }
  13. /**
  14. * 修改状态栏为全透明
  15. *
  16. * @param activity
  17. */
  18. @TargetApi(19)
  19. public static void transparencyBar(Activity activity) {
  20. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  21. Window window = activity.getWindow();
  22. window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
  23. window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
  24. | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
  25. window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
  26. window.setStatusBarColor(Color.TRANSPARENT);
  27. } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
  28. Window window = activity.getWindow();
  29. window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
  30. WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
  31. }
  32. }

Activity.java

  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4. StatusBarUtil.setWhiteBar(this);
  5. setContentView(R.layout.activity_main);
  6. }

其他补充

改变状态栏颜色

如果是单纯地改变状态栏颜色,只需要使用下面的方法即可

  1. @TargetApi(Build.VERSION_CODES.LOLLIPOP)
  2. public static void setStatusBarColor(int statusColor, Activity activity) {
  3. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  4. Window window = activity.getWindow();
  5. //取消设置Window半透明的Flag
  6. window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
  7. //添加Flag把状态栏设为可绘制模式
  8. window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
  9. //设置状态栏颜色
  10. window.setStatusBarColor(statusColor);
  11. }
  12. }

动态设置状态栏字体颜色

可以通过设置一个boolean,来判断当前状态栏的颜色是否为亮色,如果为亮色,则设置为黑色图标,如果为暗色,则设置为白色图标

  1. boolean isLightColor;
  2. int color= Color.parseColor("#f0f0f0");
  3. double v = ColorUtils.calculateLuminance(color);
  4. //判断颜色亮色
  5. if(v>=0.5){
  6. isLightColor = true;
  7. }else{
  8. isLightColor = false;
  9. }
  10. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
  11. if(isLightColor){
  12. //设置黑色字体颜色
  13. activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
  14. }else{
  15. //设置白色字体颜色
  16. activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
  17. }
  18. }

参考链接:Android沉浸式和状态栏颜色的修改

Android开发模版代码(4)——状态栏设置的更多相关文章

  1. 36个Android开发常用代码片段

    //36个Android开发常用代码片段 //拨打电话 public static void call(Context context, String phoneNumber) { context.s ...

  2. Android 开发有用代码积累

    Android开发需求变化快,开发周期要求尽量短,接下来一系列文章从实际使用出发总结一些常用的代码片段,便于查找,也为后来人提供一份参考. 1.获取Manifest的基本信息(升级页面和软件关于页面一 ...

  3. Android studio 显示代码行号 设置

    首先我们打开我们的Android Studio.   这时会弹出setting页面,我们选择show line numbers然后点击确定按钮.   此时我们就可以看到代码左侧显示出行号了   我们可 ...

  4. Android开发 从代码里设置Drawable图片不显示的问题

    问题描述 我们从代码里获得Drawable在设置给View时会发现,图片不显示的问题.比如如下代码: Drawable drawable = getResources().getDrawable(R. ...

  5. Android开发模板代码(二)——为ImageView设置图片,退出后能保存ImageView的状态

    接着之前的那个从图库选择图片,设置到ImageView中去,但是,我发现了一个问题,就是再次进入的时候ImageView是恢复到了默认状态,搜索了资料许久之后,终于是发现了解决方法,使用SharePr ...

  6. Android开发之有效获取状态栏(StatusBar)高度

    获取状态栏高度 一.传统方式:有时获取为0,解决方法看  二 1 2 3 4 代码 Rect frame = new Rect(); getWindow().getDecorView().getWin ...

  7. Android开发常用代码片段

    拨打电话 public static void call(Context context, String phoneNumber) { context.startActivity( new Inten ...

  8. Android开发UI之给ListView设置布局动画效果

    1.通过JAVA代码添加,资源文件基本上不修改 XML文件,只添加了一个ListView,就不贴XML文件的代码了. java代码: public class MainActivity extends ...

  9. Android开发模板代码(一)——简单打开图库选择照片

    首先,先贴上样本代码 //检查权限 public void checkPermission() { if (ContextCompat.checkSelfPermission(this, Manife ...

随机推荐

  1. Linux -- 进程间通信之信号量

    基本概念简述 多个线程同时访问一个共享数据,很可能造成恶劣的后果:为了保证数据访问资源的正确性和安全性,需要对线程进行"同步" (Linux下所有的执行实体都称为任务(task), ...

  2. Precision,Recall,F1的计算

    Precision又叫查准率,Recall又叫查全率.这两个指标共同衡量才能评价模型输出结果. TP: 预测为1(Positive),实际也为1(Truth-预测对了) TN: 预测为0(Negati ...

  3. cas的客户端应用是负载均衡,单点退出怎么办?

    之前的项目一直是单节点,这次在生产系统中使用了负载均衡,一个应用部署了两个节点,负载均衡策略未知.这样在使用时发现了这么一个问题:在单点退出后,应用有时候可以退出,但有时还在登陆状态,这就很郁闷了. ...

  4. 2753:走迷宫(dfs+初剪)//可以说是很水了。。。

    总时间限制:  1000ms 内存限制:  65536kB 描述 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走:有的格子是空地,可以走.给定一个迷宫,求从左上角走到右下角最少需要走多少步(数 ...

  5. 【Android - 控件】之V - SwipeRefreshLayout的使用

    SwipeRefreshLayout是Android V4.V7包中的一个控件,是Google给我们提供的一个下拉刷新的布局控件,可以轻松完成下拉刷新. SwipeRefreshLayout的特点是其 ...

  6. FBV与CBV 及CBV源码分析

    FBV与CBV 及CBV源码分析 FBV(Function Based View) 基于函数的视图 基于函数的视图,我们一直在用没啥好讲的,就是导入模块调用函数执行业务 CBV(Class Based ...

  7. linux中安装tensorflow

    liunxsudo apt-get install python-pip python-dev python2.X -> pippython3.X -> pip3 pip --versio ...

  8. C#程序编写高质量代码改善的157个建议【13-15】[为类型输出格式化字符串、实现浅拷贝和深拷贝、用dynamic来优化反射]

    前言 本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html .本文主要学习记录以下内容: 建议13.为类型输出格式化字符串 建议14.正确实现浅拷贝和深 ...

  9. 【强化学习】DQN 算法改进

    DQN 算法改进 (一)Dueling DQN Dueling DQN 是一种基于 DQN 的改进算法.主要突破点:利用模型结构将值函数表示成更加细致的形式,这使得模型能够拥有更好的表现.下面给出公式 ...

  10. Preact(React)核心原理详解

    原创: 宝丁 玄说前端 本文作者:字节跳动 - 宝丁 一.Preact 是什么 二.Preact 和 React 的区别有哪些? 三.Preact 是怎么工作的 四.结合实际组件了解整体渲染流程 五. ...