[关闭]
@zouzhenglu 2016-06-01T07:00:32.000000Z 字数 4565 阅读 104

Android状态栏黑色字体

android 状态栏 statusbar


前言

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

参考

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

1.白底黑字!Android浅色状态栏黑色字体模式

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

解决方案

源码传送门

MIUI

  1. public class MIUIHelper implements IHelper {
  2. /**
  3. * 设置状态栏字体图标为深色,需要MIUI6以上
  4. *
  5. * @param isFontColorDark 是否把状态栏字体及图标颜色设置为深色
  6. * @return boolean 成功执行返回true
  7. */
  8. @Override
  9. public boolean setStatusBarLightMode(Activity activity, boolean isFontColorDark) {
  10. Window window = activity.getWindow();
  11. boolean result = false;
  12. if (window != null) {
  13. Class clazz = window.getClass();
  14. try {
  15. int darkModeFlag = 0;
  16. Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
  17. Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
  18. darkModeFlag = field.getInt(layoutParams);
  19. Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
  20. if (isFontColorDark) {
  21. extraFlagField.invoke(window, darkModeFlag, darkModeFlag);//状态栏透明且黑色字体
  22. } else {
  23. extraFlagField.invoke(window, 0, darkModeFlag);//清除黑色字体
  24. }
  25. result = true;
  26. } catch (Exception e) {
  27. e.printStackTrace();
  28. }
  29. }
  30. return result;
  31. }
  32. }

flyme4+

  1. public class FlymeHelper implements IHelper {
  2. /**
  3. * 设置状态栏图标为深色和魅族特定的文字风格
  4. * 可以用来判断是否为Flyme用户
  5. *
  6. * @param isFontColorDark 是否把状态栏字体及图标颜色设置为深色
  7. * @return boolean 成功执行返回true
  8. */
  9. @Override
  10. public boolean setStatusBarLightMode(Activity activity, boolean isFontColorDark) {
  11. Window window = activity.getWindow();
  12. boolean result = false;
  13. if (window != null) {
  14. try {
  15. WindowManager.LayoutParams lp = window.getAttributes();
  16. Field darkFlag = WindowManager.LayoutParams.class
  17. .getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");
  18. Field meizuFlags = WindowManager.LayoutParams.class
  19. .getDeclaredField("meizuFlags");
  20. darkFlag.setAccessible(true);
  21. meizuFlags.setAccessible(true);
  22. int bit = darkFlag.getInt(null);
  23. int value = meizuFlags.getInt(lp);
  24. if (isFontColorDark) {
  25. value |= bit;
  26. } else {
  27. value &= ~bit;
  28. }
  29. meizuFlags.setInt(lp, value);
  30. window.setAttributes(lp);
  31. result = true;
  32. } catch (Exception e) {
  33. e.printStackTrace();
  34. }
  35. }
  36. return result;
  37. }
  38. }

android6.0+

1.代码设置
  1. public class AndroidMHelper implements IHelper {
  2. /**
  3. * @return if version is lager than M
  4. */
  5. @Override
  6. public boolean setStatusBarLightMode(Activity activity, boolean isFontColorDark) {
  7. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
  8. if (isFontColorDark) {
  9. // 沉浸式
  10. // activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
  11. //非沉浸式
  12. activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
  13. } else {
  14. //非沉浸式
  15. activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
  16. }
  17. return true;
  18. }
  19. return false;
  20. }
  21. }
2.style属性设置
  1. <!--直接生效,状态栏文字颜色变成黑色,非沉浸式-->
  2. <item name="android:windowLightStatusBar">true</item>

思路1

Created with Raphaël 2.1.2Startset MIUI6 success?Endset flyme4+ success?set 6.0+ success?yesnoyesnoyesno

思路2

Created with Raphaël 2.1.2Startis 6.0+ ?Endis MIUI6+ ?is flyme4+ ?yesnoyesnoyes

思路实现

  1. public class Helper {
  2. @IntDef({
  3. OTHER,
  4. MIUI,
  5. FLYME,
  6. ANDROID_M
  7. })
  8. @Retention(RetentionPolicy.SOURCE)
  9. public @interface SystemType {
  10. }
  11. public static final int OTHER = -1;
  12. public static final int MIUI = 1;
  13. public static final int FLYME = 2;
  14. public static final int ANDROID_M = 3;
  15. /**
  16. * 设置状态栏黑色字体图标,
  17. * 适配4.4以上版本MIUIV、Flyme和6.0以上版本其他Android
  18. *
  19. * @return 1:MIUI 2:Flyme 3:android6.0
  20. */
  21. public static int statusBarLightMode(Activity activity) {
  22. @SystemType int result = 0;
  23. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
  24. if (new MIUIHelper().setStatusBarLightMode(activity, true)) {
  25. result = MIUI;
  26. } else if (new FlymeHelper().setStatusBarLightMode(activity, true)) {
  27. result = FLYME;
  28. } else if (new AndroidMHelper().setStatusBarLightMode(activity, true)) {
  29. result = ANDROID_M;
  30. }
  31. }
  32. return result;
  33. }
  34. /**
  35. * 已知系统类型时,设置状态栏黑色字体图标。
  36. * 适配4.4以上版本MIUI6、Flyme和6.0以上版本其他Android
  37. *
  38. * @param type 1:MIUI 2:Flyme 3:android6.0
  39. */
  40. public static void statusBarLightMode(Activity activity, @SystemType int type) {
  41. statusBarMode(activity, type, true);
  42. }
  43. /**
  44. * 清除MIUI或flyme或6.0以上版本状态栏黑色字体
  45. */
  46. public static void statusBarDarkMode(Activity activity, @SystemType int type) {
  47. statusBarMode(activity, type, false);
  48. }
  49. private static void statusBarMode(Activity activity, @SystemType int type, boolean isFontColorDark) {
  50. if (type == MIUI) {
  51. new MIUIHelper().setStatusBarLightMode(activity, isFontColorDark);
  52. } else if (type == FLYME) {
  53. new FlymeHelper().setStatusBarLightMode(activity, isFontColorDark);
  54. } else if (type == ANDROID_M) {
  55. new AndroidMHelper().setStatusBarLightMode(activity, isFontColorDark);
  56. }
  57. }
  58. }

结论

本方案适配一下系统

  • 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的系统上统一全配置上


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

福利

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注