浅色状态栏(白底黑字)
来源:互联网 发布: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
- 浅色状态栏(白底黑字)
- 白底黑字!Android浅色状态栏黑色字体模式
- 白底黑字!Android浅色状态栏黑色字体模式
- 白底黑字!Android浅色状态栏黑色字体模式
- 白底黑字!Android浅色状态栏黑色字体模式
- 修改手机状态栏字体的颜色(如:白底黑字)
- Android 6.0+ 实现白色状态栏(白底黑字)
- 安卓状态栏白底黑字-三星S6
- 适配MIUI、Flyme、android m状态栏为白底黑字
- acvitity和fragment中都可以单独设置的沉浸式状态栏的自定义实现方式(包括白底黑字状态栏)
- Android 6.0 以上实现状态栏白底黑字 「白色标题栏 App 享受 iOS 般的沉浸体验」
- Android Settings 修改默认主题为白底黑字
- android Settings 修改默认主题为白底黑字
- AutoCAD如何方便截图放到Word文档,改成白底黑字
- Android浅色状态栏黑色字体模式
- Android沉浸式状态栏以及浅色模式开发
- 如何在Word中输入带圈数字1-10的黑底白字和白底黑字的数字字符?
- Android N 状态栏图标显示白底问题分析
- mySQL怎么导出E-R图?
- TPshop中B2C与B2B2C的一点理解
- 陈越《数据结构》第一讲 基本概念
- 含迭代器的红黑树
- Thinkphp与CI的区别
- 浅色状态栏(白底黑字)
- secureCRT常用的logcat指令
- C++学习笔记
- 数据库断线重连
- java类常用的一些方法
- OpenGL——VAO,VBO,EBO等对象的使用
- TP5中Db类与Model类关系
- Android 高级控件
- Bzoj3484 [Baltic2012]brackets