转载自:http://www.th7.cn/Program/Android/201701/1079877.shtml
有时候活动会涉及到浅色状态栏的需求,默认的状态栏上字体和图标颜色都是白色的。当我们想要设置状态栏为白色的时候,就必须要求使用浅色状态栏,浅色状态栏的字体和图标颜色都是黑色的。
比较坑爹的是能够应用浅色状态栏的系统比较少,安卓官方在6.0以后才加入了这个选项。而除此以外,小米系统MIUI V6以上和魅族系统Flyme4以上都有自己的浅色状态栏设置方案。我用自己的小米手机测试了下,我的手机是6.0的,但是官方设置浅色状态栏无效,使用针对小米的方案则成功。
所以现在思路比较清晰了,首先获取手机系统版本信息,然后判断是否可以使用浅色状态栏,可以的话则根据版本选择使用对应的方案。这一整个部分的代码量比较大,而且可复用性比较高,所以不直接放在活动中,而是封装在工具类的一个静态方法里。
先看活动要调用的方法:
public static boolean tryLightStatus(Activity activity){
if (isMIUIV6OrAbove()){
setMIUILightStatusBar(activity);
return true;
}
if (isFlymeV4OrAbove()){
setFlymeLightStatusBar(activity);
return true;
}
if (isAndroidMOrAbove()){
setAndroidNativeLightStatusBar(activity);
return true;
}
return false;
}
设置一个布尔值返回,告知是否设置了浅色状态栏。方法中又使用了三个版本判断方法和判断后的设置方法:
判断方法:
//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;
}
//MIUI V6对应的versionCode是4
//MIUI V7对应的versionCode是5
private static boolean isMIUIV6OrAbove() {
String miuiVersionCodeStr = getSystemProperty("ro.miui.ui.version.code");
if (!TextUtils.isEmpty(miuiVersionCodeStr)) {
try {
int miuiVersionCode = Integer.parseInt(miuiVersionCodeStr);
if (miuiVersionCode >= 4) {
return true;
}
} catch (Exception e) {}
}
return false;
}
//Android Api 23以上
private static boolean isAndroidMOrAbove() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return true;
}
return false;
}
//获取系统信息
private static String getSystemProperty(String propName) {
String line;
BufferedReader input = null;
try {
Process p = Runtime.getRuntime().exec("getprop " + propName);
input = new BufferedReader(new InputStreamReader(p.getInputStream()), 1024);
line = input.readLine();
input.close();
} catch (IOException ex) {
return null;
} finally {
if (input != null) {
try {
input.close();
} catch (IOException e) {
}
}
}
return line;
}
设置方法:
private static boolean setMIUILightStatusBar(Activity activity) {
Class<? extends Window> clazz = activity.getWindow().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);
extraFlagField.invoke(activity.getWindow(), darkModeFlag , darkModeFlag);
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
private static boolean setFlymeLightStatusBar(Activity activity) {
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);
value |= bit;
meizuFlags.setInt(lp, value);
activity.getWindow().setAttributes(lp);
result = true;
} catch (Exception e) {
}
}
return result;
}
private static void setAndroidNativeLightStatusBar(Activity activity) {
View decor = activity.getWindow().getDecorView();
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
我没有照搬原文代码,而是做了一点简化,这样活动仅尝试设置浅色状态栏,不能获取自己的版本信息。读者可以自行选择。