Android状态栏黑色字体

###前言

由于公司项目的欢迎页是白色的,,修改状态栏颜色后,导致状态栏的白色字体完全被覆盖了,联想到之前在QQ、UC等一些app上都见到过状态栏的字体是深色的,想着,,必定有解决的方案。于是,有了本篇blog。

###参考 下面是我在网上找到的两篇文章

1.白底黑字!Android浅色状态栏黑色字体模式
2.Android-->沉浸式状态栏字体颜色的修改(只针对小米和魅族)

解决方案

源码传送门 ####MIUI

public class MIUIHelper implements IHelper {

    /**
     * 设置状态栏字体图标为深色,需要MIUI6以上
     *
     * @param isFontColorDark 是否把状态栏字体及图标颜色设置为深色
     * @return boolean 成功执行返回true
     */
    @Override
    public boolean setStatusBarLightMode(Activity activity, boolean isFontColorDark) {
        Window window = activity.getWindow();
        boolean result = false;
        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 (isFontColorDark) {
                    extraFlagField.invoke(window, darkModeFlag, darkModeFlag);//状态栏透明且黑色字体
                } else {
                    extraFlagField.invoke(window, 0, darkModeFlag);//清除黑色字体
                }
                result = true;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return result;
    }
}

####flyme4+

public class FlymeHelper implements IHelper {

    /**
     * 设置状态栏图标为深色和魅族特定的文字风格
     * 可以用来判断是否为Flyme用户
     *
     * @param isFontColorDark 是否把状态栏字体及图标颜色设置为深色
     * @return boolean 成功执行返回true
     */
    @Override
    public boolean setStatusBarLightMode(Activity activity, boolean isFontColorDark) {
        Window window = activity.getWindow();
        boolean result = false;
        if (window != null) {
            try {
                WindowManager.LayoutParams lp = window.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 (isFontColorDark) {
                    value |= bit;
                } else {
                    value &= ~bit;
                }
                meizuFlags.setInt(lp, value);
                window.setAttributes(lp);
                result = true;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return result;
    }
}
android6.0+

#####1.代码设置

public class AndroidMHelper implements IHelper {
    /**
     * @return if version is lager than M
     */
    @Override
    public boolean setStatusBarLightMode(Activity activity, boolean isFontColorDark) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (isFontColorDark) {
                // 沉浸式
                //                activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
                //非沉浸式
                activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
            } else {
                //非沉浸式
                activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
            }
            return true;
        }
        return false;
    }

}


#####2.style属性设置

<!--直接生效,状态栏文字颜色变成黑色,非沉浸式-->
<item name="android:windowLightStatusBar">true</item>

####思路1

st=>start
condMIUI=>condition: set MIUI6 success?
condFlyme=>condition: set flyme4+ success?
cond6=>condition: set 6.0+ success?
e=>end

st->condMIUI
condMIUI(no)->condFlyme
condFlyme(no)->cond6
cond6(no)->e
cond6(yes)->e
condMIUI(yes)->e
condFlyme(yes)->e

####思路2

st=>start
cond6=>condition: is 6.0+ ?
condFlyme=>condition: is flyme4+ ?
condMIUI=>condition: is MIUI6+ ?
e=>end

st->cond6
cond6(no)->condMIUI
condMIUI(no)->condFlyme
condFlyme(no)->6
cond6(yes)->e
condMIUI(yes)->e
condFlyme(yes)->e

###思路实现

public class Helper {
    @IntDef({
            OTHER,
            MIUI,
            FLYME,
            ANDROID_M
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface SystemType {

    }

    public static final int OTHER = -1;
    public static final int MIUI = 1;
    public static final int FLYME = 2;
    public static final int ANDROID_M = 3;

    /**
     * 设置状态栏黑色字体图标,
     * 适配4.4以上版本MIUIV、Flyme和6.0以上版本其他Android
     *
     * @return 1:MIUI 2:Flyme 3:android6.0
     */
    public static int statusBarLightMode(Activity activity) {
        @SystemType int result = 0;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            if (new MIUIHelper().setStatusBarLightMode(activity, true)) {
                result = MIUI;
            } else if (new FlymeHelper().setStatusBarLightMode(activity, true)) {
                result = FLYME;
            } else if (new AndroidMHelper().setStatusBarLightMode(activity, true)) {
                result = ANDROID_M;
            }
        }
        return result;
    }

    /**
     * 已知系统类型时,设置状态栏黑色字体图标。
     * 适配4.4以上版本MIUI6、Flyme和6.0以上版本其他Android
     *
     * @param type 1:MIUI 2:Flyme 3:android6.0
     */
    public static void statusBarLightMode(Activity activity, @SystemType int type) {
        statusBarMode(activity, type, true);

    }

    /**
     * 清除MIUI或flyme或6.0以上版本状态栏黑色字体
     */
    public static void statusBarDarkMode(Activity activity, @SystemType int type) {
        statusBarMode(activity, type, false);
    }

    private static void statusBarMode(Activity activity, @SystemType int type, boolean isFontColorDark) {
        if (type == MIUI) {
            new MIUIHelper().setStatusBarLightMode(activity, isFontColorDark);
        } else if (type == FLYME) {
            new FlymeHelper().setStatusBarLightMode(activity, isFontColorDark);
        } else if (type == ANDROID_M) {
            new AndroidMHelper().setStatusBarLightMode(activity, isFontColorDark);
        }
    }

}

结论

本方案适配一下系统

  • android6.0+
  • MIUI6
  • flyme4+

据说:适配浅色状态栏深色字体的时候发现底层版本为Android6.0.1的MIUI7.1系统不支持View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR设置,还是得用MIUI自己的深色字体方法。所以,这里先适配MIUI跟flyme,再适配6.0,当然了,如果使用可以直接获取系统名,根据字符串判断,也可以先6.0在MIUI,但是这个不靠谱。还不如直接在6的系统上统一全配置上


说了这么多废话,,下面进入正题

福利

转载于:https://my.oschina.net/zouzhenglu/blog/685458

  • 0
    点赞
  • 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、付费专栏及课程。

余额充值