Android修改状态栏的背景颜色
一,概述
我相信很多初入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修改状态栏的背景颜色相关推荐
- ubuntu16.04 xfce4的鼠标主题设置为oxygen-red、修改文件夹背景颜色、两处系统字体设置、右键菜单添加压缩解压选项
安装 oxygen-cursor-theme oxygen-cursor-theme-extra 然后 设置=>鼠标和触摸板 如果是自定义鼠标主题,那么把主题文件解压后拷贝到: /usr/sha ...
- 5月5日——更改手机状态栏的背景颜色
使用mui更改手机顶部状态栏的背景颜色: plus.navigator.setStatusBarBackground("#FF0000") 转载于:https://www.cnbl ...
- 如何修改PyCharm窗口背景颜色?
如何修改PyCharm窗口背景颜色? 前言 PyCharm是一种Python IDE,它可以提高用户在使用Python语言时的开发效率,它的默认窗口颜色是白色,但有时候我们希望窗口颜色较深一些,这样有 ...
- 快速去除照片的背景颜色和修改照片的背景颜色
1.https://www.remove.bg/upload 打开这个网址,上传照片就可以快速的修改照片的背景颜色 2.百度搜索remove image background 进入到官网,上传照 ...
- Android 修改默认的背景壁纸(msm8909)
Android 修改默认的背景壁纸 第一步定位文件: /frameworks/base/core/res/res中的drawable-sw720dp-nodpi .drawable-sw600dp-n ...
- Win7如何修改文件夹背景颜色教学
Win7如何修改文件夹背景颜色教学分享.我们电脑的文件夹背景颜色默认都是白色的,那么我们要怎么去将它设置成为其他的颜色呢?比如将它设置成为护眼绿色,接下来我们一起来看看详细的操作方法教学吧. 操作方法 ...
- python(自带的idle+pycharm)常用的快捷键+如何自定义快捷键以及如何修改pycharm的背景颜色
文章目录 一.自带的idle 1.常用的快捷键 2.如何自定义快捷键 二.pycharm 1.常用的快捷键 2.如何自定义快捷键 三.如何修改pycharm的背景颜色 一.自带的idle 1.常用的快 ...
- Visual Studio - 修改代码编辑背景颜色
Visual Studio - 修改代码编辑背景颜色 1 Item background: Default 2 Item background: Green Tools -> Options - ...
- android白色状态栏字体颜色,Android 修改状态栏字体颜色
针对Android6.0+,MIUI6+,Flyme4+可以修改状态栏字体颜色: 1.对于android6.0,但是小米魅族不适配(见2,3) //设置成白色的背景,字体颜色为黑色. if (Buil ...
- php视频直播系统源码Android 修改状态栏颜色 白色、透明色
封装工具类StatusBarUtils public class StatusBarUtils {/*** 修改状态栏为全透明** @param activity*/@TargetApi(19)pub ...
最新文章
- 一、你要拥有自己的服务器
- mysql修复坏表的方法
- 招聘 | B站前端架构师(直播)
- python加载项向导_什么是 Python 加载项?
- eclipse查看git地址_使用Git进行版本控制
- Dive Into Thrift Node-安装
- 雪城大学信息安全讲义 一、引言
- Window Operations
- iOS使用多线程提高数据并发访问 之三
- 广数928te_广数928te2说明书
- Android开源项目第一篇——个性化控件(View)篇
- 测试开发面试题汇总20200422
- 华为荣耀手机 (HUAWEI Honor V9) USB 调试 - ADB 调试
- bzoj 2339: [HNOI2011]卡农 组合数学+递推
- true_fn和false_fn输出的dtype类型不一致怎么办
- 微信网页授权获取用户昵称中文乱码
- 以DA方式通过opcdaauto.dll访问opc服务器异步操作异常0x80040200问题
- 程序员初学者频繁使用count(*),被组长批评后怒怼:性能并不拉垮
- C++视频会议demo源码下载
- TeamCity打包部署镜像
热门文章
- 【BIEE】MDS-01377:无法从使用 JNDI 名称 “jdbc/mds/owsm” 配置的数据源获取数据库连接...
- Java 随机数,可变参数,JDBC,访问控制
- 【前端安全】JavaScript防http劫持与XSS (转)
- 常量 变量 赋值 c
- 感觉非常经典的一片博文(关于缓存)
- Unity3d中使用自带动画系统制作下雨效果(二)
- Hibernate深入浅出(六)事务2——锁locking
- 36.Linux/Unix 系统编程手册(下) -- 进程资源
- 25.摘要认证(2)
- 3. Javascript 对象