MIUI 9 & 10“状态栏黑色字符”实现方法变更通知
我们在开发版 7.7.13(2017年的开发版) 及以后的版本,MIUI 状态栏更新了一处实现逻辑。直接影响就是,部分应用无法显示“状态栏黑色字符”,如下图中的即刻、UC、好奇心日报等应用。
1. 问题出现的原因
- 在 Android 6.0 以前,Android 没有方法可以实现“状态栏黑色字符”效果,因此 MIUI 自己做了一个接口。
- 在 Android 6.0 及以上版本,Android 提供了标准的方法实现“状态栏黑色字符”效果,但这个方法和 MIUI 的方法产生了冲突,以致于当开发者使用 Android 标准方法时,没APP生成有出现预期的效果,这给很多开发者都造成了困扰,尤其是海外开发者。
2. 如何解决
基于以上背景,我们决定兼容 Android 的方法,舍弃 MIUI 的自己的实现方法。从今天的 7.7.13 开发版生效,之后随 MIUI 9 外发。非常抱歉给各位开发者带来麻烦,但长远来看,兼容 Android 的标准,对 MIUI 和开发者都更为有利。
3. 开发者需要做的
如果开发者需要设置“状态栏黑色字符”的效果, 需要做以下几件事:
3.1. 在新的 MIUI 版本(即基于 Android 6.0 ,开发版 7.7.13 及以后版本)
- 使用 View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR ,来设置“状态栏黑色字符”效果
- 同时要设置 WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
- 并且不设置 WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
参考实例:
Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
3.2. 在旧的MIUI版本
还有大量的用户使用旧的 MIUI 版本,因此仍然需要使用 MIUI 原有的方法,即
public void setStatusBarDarkMode(boolean darkmode, Activity activity) {
Class<? extends Window> clazz = activity.getapp生成器有哪些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);
extraFlagField.invoke(activity.getWindow(), darkmode ? darkModeFlag : 0, darkModeFlag);
} catch (Exception e) {
e.printStackTrace();
}
}
对于广大开发者而言,为了保证在新旧版本的 MIUI 都能实现「状态栏黑色字符」的效果,需要开发者同时写上以上两种实现方法。给各位开发者带来麻烦,再次表达歉意,望谅解。文末附上了常见问题,如果在适配过程中遇到问题,可以邮件给我们的项目组 miuix-systemui@xiaomi.com,会有同事解答相关疑问。。
4. FAQ
4.1. 如何调试
如前所述,相关改动将从 7.7.13 开发版(2017年的版本)及以后版本生效,因此开发者升级到 MIUI 10 最新开发版即可,支持的机型和下载链接如下(找到对应机型的最新开发版):
- 国内版 ROM:https://www.miui.com/download.html
- 国际版 ROM:http://en.miui.com/download.html
4.2. 如何实现状态栏白色字符效果
int flag = window.getDecorView().getSystemUiVisibility() & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
window.getDecorView().setSystemUiVisibility(flag);
编辑:yimen,如若转载,请注明出处:https://www.yimenapp.com/kb-yimen/12241/
部分内容来自网络投稿,如有侵权联系立删