android开发:一个工具类搞定所有机型实现沉浸式状态栏
1.在build.gradle引入依赖
implementation 'com.readystatesoftware.systembartint:systembartint:1.0.3'
2.导入工具类
package com.example.toolbarapplication;import android.annotation.TargetApi;
import android.app.Activity;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;import com.readystatesoftware.systembartint.SystemBarTintManager;import java.lang.reflect.Field;
import java.lang.reflect.Method;/*** @Author: david.lvfujiang* @Date: 2019/12/13* @Describe:*/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_STABLE);window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);window.setStatusBarColor(Color.TRANSPARENT);window.setNavigationBarColor(Color.TRANSPARENT);} elseif (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.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**/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 window 需要设置的窗口* @param dark 是否把状态栏字体及图标颜色设置为深色* @return boolean 成功执行返回true**/public 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;}/*** 谷歌原生修改状态栏字体颜色* @param activity* @param dark*/public static void setAndroidNativeLightStatusBar(Activity activity, boolean dark) {View decor = activity.getWindow().getDecorView();if (dark) {decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);} else {decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);}}}
3.在acctivity的setContentView()方法后调用
//支持状态栏透明StatusBarUtil.transparencyBar(this);//使用谷歌原生方式修改状态栏颜色StatusBarUtil.setAndroidNativeLightStatusBar(this,true);
4.因为我们的去掉状态栏之后我们的标题或者布局会顶到状态栏,因此我们需要在xml中给根布局或Toolbar设置android:fitsSystemWindows="true"
android:fitsSystemWindows的作用是给布局或者Toolbar设置一个状态栏高度的paddingTop
android开发:一个工具类搞定所有机型实现沉浸式状态栏相关推荐
- Android开发常用工具类集合
转载自:https://blog.csdn.net/xiaoyi_tdcq/article/details/52902844 Android开发常用工具类集合 android开发中为了避免重复造轮子, ...
- android开发常用工具类、高仿客户端、附近厕所、验证码助手、相机图片处理等源码...
Android精选源码 android开发过程经常要用的工具类源码 Android类似QQ空间个人主页下拉头部放大的布局效果 Android高仿煎蛋客户端,Android完整项目 android帮你找 ...
- android开发常用工具类、高仿客户端、附近厕所、验证码助手、相机图片处理等源码
Android精选源码 android开发过程经常要用的工具类源码 Android类似QQ空间个人主页下拉头部放大的布局效果 Android高仿煎蛋客户端,Android完整项目 android帮你找 ...
- Android开发辅助工具类 Utils
包括了各种工具类.辅助类.管理类等 都可以 在Git 里找到代码 来研究,深入 Awesome_API: https://github.com/marktony/Awesome_API/blo ...
- Android开发辅助工具类 Utils 汇总
包括了各种工具类.辅助类.管理类等 Awesome_API: https://github.com/marktony/Awesome_API/blob/master/Chinese.md 收集中国国内 ...
- 扔掉 Postman,一个工具全部搞定,真香!
今日推荐 论异步编程的正确姿势:十个接口的活现在只需要一个接口就能搞定!让SpringBoot不再需要Controller.Service.Mapper,这款开源工具绝了!「吐血」我把 10 年的全部 ...
- Android开发常用工具类
来源于http://www.open-open.com/lib/view/open1416535785398.html 主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java. 目前 ...
- (转)Android开发常用工具类
原地址:http://blog.csdn.net/axi295309066/article/details/52884973 不管是前端,后端,还是我们的Android开发,实际工作中都会用到很多的工 ...
- 网络请求以及网络请求下载图片的工具类 android开发java工具类
2019独角兽企业重金招聘Python工程师标准>>> package cc.jiusan.www.utils;import org.apache.http.HttpEntity; ...
最新文章
- 虚拟化--图解交互式方式安装ESXi_5.0的过程
- Latex(一)公式自动编号与自动引用
- mysql 优化配置 大批量数据插入_php导入大量数据到mysql性能优化技巧
- 嵌入式常见笔试题总结(5)
- freecodecamp_freeCodeCamp的服务条款
- CODE[VS] 1346 HelloWorld编译器
- idea 导入到码云
- 最早使用计算机领域,第2章 交换单元及交换网络(2.3.4).ppt
- 如何设计最惊艳的PPT
- xp系统安装金蝶k3服务器配置,xp安装金蝶k3安全设置.doc
- Flutter插件shared_preferences数据存储的使用
- Java课程设计学生考勤管理
- php自动驾驶面试题,一篇文章看懂“L0-L5”,自动驾驶分级标准最强解读
- 关于SQL Server中将数值类型转换为字符串的问题
- Java之图片裁剪工具类-yellowcong
- 动词ing基本用法_(完整版)英语动词ing的用法
- 牛客网JS(nodeJS)单行、多行输入和输出
- linux安装ntp 4.2.8,Centos6 安装NTP 4.2.8 服务器
- 如何在电脑中下载cctv中的视频
- Photoshop 2022版