android 重叠颜色,记录状态栏与布局重合,状态栏颜色问题
android:clipToPadding="true"
android:fitsSystemWindows="true"
添加在父布局XML中
2.改变状态栏颜色与背景颜色值
调用方法:
package com.example.administrator.myapplicationtest.Tools;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Build;
import android.os.Environment;
import android.text.TextUtils;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import java.io.File;
import java.io.FileInputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Properties;
/**
* auther Android
* Created by on 2019/4/5.
* Describe :
*/
public class StatusBarUtil {
class AvailableRomType {
public static final int MIUI =1;
public static final int FLYME =2;
public static final int ANDROID_NATIVE =3;
public static final int NA =4;
}
public static int getLightStatusBarAvailableRomType() {
//开发版 7.7.13 及以后版本采用了系统API,旧方法无效但不会报错
if (isMiUIV7OrAbove()) {
return AvailableRomType.ANDROID_NATIVE;
}
if (isMiUIV6OrAbove()) {
return AvailableRomType.MIUI;
}
if (isFlymeV4OrAbove()) {
return AvailableRomType.FLYME;
}
if (isAndroidMOrAbove()) {
return AvailableRomType.ANDROID_NATIVE;
}
return AvailableRomType.NA;
}
//Flyme V4的displayId格式为 [Flyme OS 4.x.x.xA]
//Flyme V5的displayId格式为 [Flyme 5.x.x.x beta]
private static boolean isFlymeV4OrAbove() {
String displayId = Build.DISPLAY;
if (!TextUtils.isEmpty(displayId) && displayId.contains("Flyme")) {
String[] displayIdArray = displayId.split(" ");
for (String temp : displayIdArray) {
//版本号4以上,形如4.x.
if (temp.matches("^[4-9]\\.(\\d+\\.)+\\S*")) {
return true;
}
}
}
return false;
}
//Android Api 23以上
private static boolean isAndroidMOrAbove() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;
}
private static final StringKEY_MIUI_VERSION_CODE ="ro.miui.ui.version.code";
private static boolean isMiUIV6OrAbove() {
try {
final Properties properties =new Properties();
properties.load(new FileInputStream(new File(Environment.getRootDirectory(), "build.prop")));
String uiCode = properties.getProperty(KEY_MIUI_VERSION_CODE, null);
if (uiCode !=null) {
int code = Integer.parseInt(uiCode);
return code >=4;
}else {
return false;
}
}catch (final Exceptione) {
return false;
}
}
static boolean isMiUIV7OrAbove() {
try {
final Properties properties =new Properties();
properties.load(new FileInputStream(new File(Environment.getRootDirectory(), "build.prop")));
String uiCode = properties.getProperty(KEY_MIUI_VERSION_CODE, null);
if (uiCode !=null) {
int code = Integer.parseInt(uiCode);
return code >=5;
}else {
return false;
}
}catch (final Exceptione) {
return false;
}
}
/**
* 修改状态栏文字颜色,这里小米,魅族区别对待。
*/
public static void setLightStatusBar(final Activityactivity, final boolean dark) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
switch (StatusBarUtil.getLightStatusBarAvailableRomType()) {
case StatusBarUtil.AvailableRomType.MIUI:
MIUISetStatusBarLightMode(activity, dark);
break;
case StatusBarUtil.AvailableRomType.FLYME:
setFlymeLightStatusBar(activity, dark);
break;
case StatusBarUtil.AvailableRomType.ANDROID_NATIVE:
setAndroidNativeLightStatusBar(activity, dark);
break;
}
}
}
public static boolean MIUISetStatusBarLightMode(Activityactivity, 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 && StatusBarUtil.isMiUIV7OrAbove()) {
//开发版 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_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
}
}
}catch (Exceptione) {
}
}
return result;
}
private static boolean setFlymeLightStatusBar(Activityactivity, boolean dark) {
boolean result =false;
if (activity !=null) {
try {
WindowManager.LayoutParams lp =activity.getWindow().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);
activity.getWindow().setAttributes(lp);
result =true;
}catch (Exceptione) {
}
}
return result;
}
public static void setAndroidNativeLightStatusBar(Activityactivity, 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);
}
}
/**
* 隐藏状态栏
* 发现没啥卵用
* @param activity
*/
@TargetApi(19)
public static void transparencyBar(Activityactivity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window =activity.getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.TRANSPARENT);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}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(Activityactivity, int colorId) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window =activity.getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(activity.getResources().getColor(colorId));
}
}
/**
* 获取状态栏高度
* @param context
* @return
*/
public static int getStatusBarHeight(Contextcontext) {
Class c =null;
Object obj =null;
Field field =null;
int x =0, statusBarHeight =0;
try {
c = Class.forName("com.android.internal.R$dimen");
obj = c.newInstance();
field = c.getField("status_bar_height");
x = Integer.parseInt(field.get(obj).toString());
statusBarHeight =context.getResources().getDimensionPixelSize(x);
}catch (Exceptione1) {
e1.printStackTrace();
}
return statusBarHeight;
}
}
android 重叠颜色,记录状态栏与布局重合,状态栏颜色问题相关推荐
- 刘海屏全屏显示(主要是隐藏状态栏且布局在状态栏位置上生效)
我的手机是红米Note 9 刘海屏,其他刘海屏不一定有用,但不妨试一试 其实非刘海屏的话,只需要在清单文件对应的activity下指定一个自定义的theme,theme的内容为以下内容即可 <s ...
- Android布局延伸状态栏,Android沉浸式全屏讲解(状态栏、导航栏处理)
Android应用中经常会有一些要求全屏显隐状态栏导航栏的需求.通过全屏沉浸式的处理可以让应用达到更好的显示效果.下面系统的讲解一下有关全屏,隐藏状态栏导航栏,沉浸式的知识. 在Android4.1之 ...
- android布局黑色字体颜色,Android 沉浸式状态栏-字体颜色与背景颜色修改实现与兼容...
沉浸式状态栏究其根本就是将布局内容延伸到状态栏中,让状态栏覆盖在布局上或者隐藏. 实现 首先,要修改状态栏android版本至少要在4.4以上,并且在4.4是不能让状态栏透明的,只能达到一种半透明的阴 ...
- Android延伸布局到状态栏,Android 状态栏透明
前言:最近项目大量用到状态栏透明,网上也出现很多库可以直接拿来用,个人认为没有必要那么重引用到一个库(有木有同学和我有一样的想法),所以研究了一番,在此做个记录加强记忆也便后期查阅,如果无意中有幸能帮 ...
- Android 手机状态栏变透明以及更换颜色
我直接封装好了一个工具类,可以直接透明,或者自定义颜色,直 接调用就可以,具体的调用方法卸载后面,共需要三个工具类我全部贴在下面 一.工具类1( EyesKitKat ) @TargetApi(B ...
- android实现系统状态栏的隐藏方法,Android隐藏系统状态栏(沉浸式状态栏)和设置状态栏颜色...
Android 5.0(API 21)之后就可以对系统状态栏进行设置了,这里我不是想深入讨论对系统状态栏的一些高级设置,因为一般也用不到,我只想说最常见的两种场景 隐藏系统状态栏,这就是感觉很牛逼的沉 ...
- Android——设置布局的背景颜色
//设置布局的背景颜色 linearLayout.setBackgroundColor(getResources().getColor(R.color.color_blue)); 要求版本API 16
- Android沉浸式状态栏(透明系统状态栏)
Android沉浸式状态栏(透明系统状态栏)的目的:顶部系统状态栏和App的导航栏一体化,不给用户突兀的感觉,使用户把更多的视角留在我们的App上. 沉浸式状态栏的兼容情况 Android版本 透明状 ...
- 【Android 性能优化】布局渲染优化 ( 过渡绘制 | 背景设置产生的过度绘制 | Android 系统的渲染优化 | 自定义布局渲染优化 )
文章目录 一. 背景设置产生的过度绘制 二. Android 系统的渲染优化 1. 透明组件数据传递 2. GPU 存储机制 3. Android 7.0 之后的优化机制 三. 自定义布局渲染优化 一 ...
最新文章
- 网络营销外包专员浅析从用户角度出发如何完善网络营销外包?
- Requests方法 -- 关联用例执行
- 快速排序的三种实现方法
- 区块链在阿里巴巴天猫中的应用
- java rhino_在Java 8中使用Rhino
- Python--进程、线程、协程对比
- 物理搬砖问题_全职业通用,搬砖市场装备
- js 字符串插入_前端利器React,为什么推荐JSX来替换JS
- vue element Form-Item prop
- 20190804:有效的括号(误删补发)
- 【转】char,wchar_t,WCHAR,TCHAR,ACHAR的区别
- 斐波那契数列(剑指offer)
- 数据结构和算法(C语言版)期末速成基础不挂科补考
- dcs world f15c教学_烟台TSXP57353M【四点零自动化】DCS系统
- 微信公众号注册认证流程
- 【环境搭建】zip 分卷压缩
- HTML5期末大作业:生态环境网站设计——环境保护主题-绿色环保 (9页) web期末作业设计网页_绿色环保大学生网页设计作业成品
- mysql删除表中数据
- PC客户端软件的安装和卸载测试知识点
- LeetCode 刷题系列(前缀和题目)之 974. 和可被 K 整除的子数组