浅色状态栏(白底黑字)

转载自: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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果您想让 Android 状态栏变为黑色,可以使用以下步骤: 1. 在 AndroidManifest.xml 中的应用程序主题中添加以下属性: ```xml android:theme="@style/Theme.AppCompat.Light.NoActionBar" ``` 2. 在 styles.xml 文件中添加以下样式: ```xml <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:statusBarColor">#000000</item> </style> ``` 3. 将应用程序主题设置为上述样式: ```xml android:theme="@style/AppTheme" ``` 这样就可以将 Android 状态栏设置为黑色。注意,这些步骤可能因 Android 版本和使用的库而有所不同。 ### 回答2: 在 Android 设备上,状态栏是显示在屏幕顶部的区域,它包含了诸如时间、电量、网络连接等系统信息。根据 Android 的设计理念,当状态栏背景色为白色时,状态栏上的文字以黑色显示,以确保良好的可读性和用户体验。 在某些情况下,我们可能希望状态栏的背景色为黑色,这种情况通常发生在应用程序需要全屏显示时。当状态栏背景色为黑色时,为了保持文字的可读性,Android 系统会自动将状态栏上的文字颜色设置为浅色,即白色。 我们可以通过在应用程序的代码中进行设置来实现这个效果。一种常用的方法是使用 `Window` 类的 `setStatusBarColor()` 方法,该方法接受一个表示颜色的整数值作为参数。要将状态栏的背景色设置为黑色,我们可以传入颜色值 `Color.BLACK`。这将使系统将状态栏的背景色设置为黑色,并将文字颜色设置为白色,以确保良好的对比度。 需要注意的是,为了能够正确设置状态栏的背景色,我们的应用程序必须使用对应的主题或样式。通常,我们可以在 AndroidManifest.xml 文件中的 `<application>` 标签中指定主题,或在布局文件中使用 `android:theme` 属性指定样式。 综上所述,Android 状态栏的黑色背景可通过编程设置来实现,以实现全屏显示效果。通过将状态栏背景色设置为黑色,系统会自动将状态栏上的文字颜色设置为浅色,以保证良好的可读性和用户体验。 ### 回答3: Android 状态栏变为黑色的原因有以下几种情况。 首先,如果手机使用的是安卓5.0及以上版本,则在桌面背景浅色的情况下,状态栏默认会变为黑色。这是为了让状态栏的图标和文字更加清晰可见。如果你想要将状态栏变回白色,可以通过修手机系统的设置来实现。 其次,有些应用程序会在特定的界面或场景下将状态栏变为黑色。这种情况通常出现在游戏、多媒体和照片应用中,以提供更好的视觉体验。当你退出这些应用后,状态栏会恢复为原来的颜色。 此外,一些定制的Android ROM也可能会将状态栏默认设置为黑色。这些定制ROM通常可以通过修系统设置或者安装主题来状态栏的颜色。 最后,个别机型的手机厂商对于状态栏的颜色进行了定制。例如,一加手机在系统设置中提供了自定义状态栏颜色的选项,用户可以根据自己的喜好将状态栏设置为黑色或其他颜色。 总结来说,Android 状态栏变为黑色可能是为了提高可见性、提供更好的视觉体验,或者是由于手机厂商或应用程序的定制设置。如果你想要状态栏的颜色,可以尝试修手机系统设置、更换主题或者使用定制ROM等方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值