浅色状态栏(白底黑字)

来源:互联网 发布:js 数值比大小 编辑:程序博客网 时间:2024/04/29 11:45

转载自: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);    }


我没有照搬原文代码,而是做了一点简化,这样活动仅尝试设置浅色状态栏,不能获取自己的版本信息。读者可以自行选择。



阅读全文
1 0
原创粉丝点击