浅色状态栏(白底黑字)

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


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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值