一,概述

我相信很多初入Android开发的开发者都为自己开发的app的状态栏烦恼过,状态栏和自己的界面风格格格不入,但是不知道如何修改这个状态栏的颜色,感觉无从下手.我最近就是被这个状态的默认风格搞得焦头烂额,终于找到了相应的解决办法.虽然代码不是我写的,我也只能看懂一部分代码,但这又有什么关系呢?我们这些热爱Java语言的人,在看不懂别人代码的情况下,只要会面向对象就行了.所有我就直接把找到的代码当成一个工具类,用着真舒服,在此就谢谢那个(或者那些)无名大神了.

二,状态栏工具类

这个状态栏工具类StatusBarUtil对MIUI flyme及安卓版本做了适配,代码量也挺多的,接近200行.我尝试看了一下代码,看不懂,然后看了它的方法说明,就大概知道它的作用了(感谢会写注释说明的大神).也不多说,直接上代码.(再次声明,这份代码来自某位或某些无名大神).

package com.bighuan.okhttpdemo.utils.statusbar;import android.annotation.TargetApi;
import android.app.Activity;
import android.graphics.Color;
import android.os.Build;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;import com.readystatesoftware.systembartint.SystemBarTintManager;import java.lang.reflect.Field;
import java.lang.reflect.Method;/*** 用来管理手机状态栏一系列操作,主要是就Window类的使用*/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| WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);//api21新增接口window.setStatusBarColor(Color.TRANSPARENT);window.setNavigationBarColor(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.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.getWindow(), 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.getWindow(), 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.getWindow(), 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*/private 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*/private 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;}
}

直接将这个工具类导入AS项目中是会报错的,因为这个工具类也是基于一个开源项目的.我通过报错的代码,找啊找,马上就在github上找到了,就是这个开源项目 SystemBarTint.这个项目虽然已经显示废弃不再维护了,但是好像还是很多人在用.那我当然也用了.

三,导入开源项目

在AS项目的app目录下的build.gradle文件的dependencies闭包中,添加如下这行代码,同步后就可以使用SystemBarTint这个项目了.

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

工具类中的那几个方法的作用一看就懂,我讨厌默认的状态栏效果,就在自己写的Activity基类的onCreate()方法中添加了如下一行代码:

 //将状态栏设置为绿色:#38B059changeStatusBarColor(R.color.myColor_green);

R.color.myColor_green就是我在color文件中声明的一个颜色,就是#38B059了.看个效果呗:

我将状态栏设置成#38B059,后面子类如果继承Activity基类,状态栏就统统都是那个绿色了.如果页面有actionbar,我们将actionbar也设置成#38B059,一体感是不是很强啊!?

四,总结

Android最大的魅力就是开源了,这句话确实一点都没错.也是得益于这种开源思想,很多大神无私的将代码分享出来,帮助无数开发者,真的是太感谢了.今天写这篇博客可能就是加深一下记忆吧,顺便做一个个人笔记.好了,本文到此结束,下篇博客见!

Android修改状态栏的背景颜色相关推荐

  1. ubuntu16.04 xfce4的鼠标主题设置为oxygen-red、修改文件夹背景颜色、两处系统字体设置、右键菜单添加压缩解压选项

    安装 oxygen-cursor-theme oxygen-cursor-theme-extra 然后 设置=>鼠标和触摸板 如果是自定义鼠标主题,那么把主题文件解压后拷贝到: /usr/sha ...

  2. 5月5日——更改手机状态栏的背景颜色

    使用mui更改手机顶部状态栏的背景颜色: plus.navigator.setStatusBarBackground("#FF0000") 转载于:https://www.cnbl ...

  3. 如何修改PyCharm窗口背景颜色?

    如何修改PyCharm窗口背景颜色? 前言 PyCharm是一种Python IDE,它可以提高用户在使用Python语言时的开发效率,它的默认窗口颜色是白色,但有时候我们希望窗口颜色较深一些,这样有 ...

  4. 快速去除照片的背景颜色和修改照片的背景颜色

    1.https://www.remove.bg/upload   打开这个网址,上传照片就可以快速的修改照片的背景颜色 2.百度搜索remove image background  进入到官网,上传照 ...

  5. Android 修改默认的背景壁纸(msm8909)

    Android 修改默认的背景壁纸 第一步定位文件: /frameworks/base/core/res/res中的drawable-sw720dp-nodpi .drawable-sw600dp-n ...

  6. Win7如何修改文件夹背景颜色教学

    Win7如何修改文件夹背景颜色教学分享.我们电脑的文件夹背景颜色默认都是白色的,那么我们要怎么去将它设置成为其他的颜色呢?比如将它设置成为护眼绿色,接下来我们一起来看看详细的操作方法教学吧. 操作方法 ...

  7. python(自带的idle+pycharm)常用的快捷键+如何自定义快捷键以及如何修改pycharm的背景颜色

    文章目录 一.自带的idle 1.常用的快捷键 2.如何自定义快捷键 二.pycharm 1.常用的快捷键 2.如何自定义快捷键 三.如何修改pycharm的背景颜色 一.自带的idle 1.常用的快 ...

  8. Visual Studio - 修改代码编辑背景颜色

    Visual Studio - 修改代码编辑背景颜色 1 Item background: Default 2 Item background: Green Tools -> Options - ...

  9. android白色状态栏字体颜色,Android 修改状态栏字体颜色

    针对Android6.0+,MIUI6+,Flyme4+可以修改状态栏字体颜色: 1.对于android6.0,但是小米魅族不适配(见2,3) //设置成白色的背景,字体颜色为黑色. if (Buil ...

  10. php视频直播系统源码Android 修改状态栏颜色 白色、透明色

    封装工具类StatusBarUtils public class StatusBarUtils {/*** 修改状态栏为全透明** @param activity*/@TargetApi(19)pub ...

最新文章

  1. 一、你要拥有自己的服务器
  2. mysql修复坏表的方法
  3. 招聘 | B站前端架构师(直播)
  4. python加载项向导_什么是 Python 加载项?
  5. eclipse查看git地址_使用Git进行版本控制
  6. Dive Into Thrift Node-安装
  7. 雪城大学信息安全讲义 一、引言
  8. Window Operations
  9. iOS使用多线程提高数据并发访问 之三
  10. 广数928te_广数928te2说明书
  11. Android开源项目第一篇——个性化控件(View)篇
  12. 测试开发面试题汇总20200422
  13. 华为荣耀手机 (HUAWEI Honor V9) USB 调试 - ADB 调试
  14. bzoj 2339: [HNOI2011]卡农 组合数学+递推
  15. true_fn和false_fn输出的dtype类型不一致怎么办
  16. 微信网页授权获取用户昵称中文乱码
  17. 以DA方式通过opcdaauto.dll访问opc服务器异步操作异常0x80040200问题
  18. 程序员初学者频繁使用count(*),被组长批评后怒怼:性能并不拉垮
  19. C++视频会议demo源码下载
  20. TeamCity打包部署镜像

热门文章

  1. 【BIEE】MDS-01377:无法从使用 JNDI 名称 “jdbc/mds/owsm” 配置的数据源获取数据库连接...
  2. Java 随机数,可变参数,JDBC,访问控制
  3. 【前端安全】JavaScript防http劫持与XSS (转)
  4. 常量 变量 赋值 c
  5. 感觉非常经典的一片博文(关于缓存)
  6. Unity3d中使用自带动画系统制作下雨效果(二)
  7. Hibernate深入浅出(六)事务2——锁locking
  8. 36.Linux/Unix 系统编程手册(下) -- 进程资源
  9. 25.摘要认证(2)
  10. 3. Javascript 对象