search
开发文档
开发文档/应用开发/系统适配/通知与状态栏/MIUI9&10状态栏黑色字符实现方法
MIUI9&10状态栏黑色字符实现方法更新时间:2024-09-27 15:02:00

我们在开发版 7.7.13(2017年的开发版) 及以后的版本,状态栏更新了一处实现逻辑。直接影响就是,部分应用无法显示“状态栏黑色字符”,如下图中的即刻、UC、好奇心日报等应用。

一、 问题出现的原因

  • 在 Android 6.0 以前,Android 没有方法可以实现“状态栏黑色字符”效果,因此 MIUI 8 之前,系统设计了一个接口。
  • 在 Android 6.0 及以上版本,Android 提供了标准的方法实现“状态栏黑色字符”效果,但这个方法和系统设计的方法产生了冲突,以致于当开发者使用 Android 标准方法时,没有出现预期的效果,这给很多开发者都造成了困扰,尤其是海外开发者。

二、如何解决

基于以上背景,我们决定兼容 Android 的方法,舍弃原有实现方法。从今天的 7.7.13 开发版生效,之后随 MIUI 9 外发。非常抱歉给各位开发者带来麻烦,但长远来看,兼容 Android 的标准,对开发者更为有利。

三、开发者需要做的

如果开发者需要设置“状态栏黑色字符”的效果, 需要做以下几件事:

1、在 MIUI 9及之后的系统版本(即基于 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);

2、在旧的MIUI版本

还有大量的用户使用旧的 MIUI 版本,因此仍然需要使用 MIUI 原有的方法,即

public void setStatusBarDarkMode(boolean darkmode, 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(), darkmode ? darkModeFlag : 0, darkModeFlag);
} catch (Exception e) {
e.printStackTrace();
}
}

对于广大开发者而言,为了保证在新旧版本的系统 都能实现「状态栏黑色字符」的效果,需要开发者同时写上以上两种实现方法。给各位开发者带来麻烦,再次表达歉意,望谅解。文末附上了常见问题,如果在适配过程中遇到问题,可以邮件给我们的项目组 miuix-systemui@xiaomi.com,会有同事解答相关疑问。

四、FAQ

1、如何调试

升级到MIUI 10最新开发版即可

2、如何实现状态栏白色字符效果

int flag = window.getDecorView().getSystemUiVisibility() & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
window.getDecorView().setSystemUiVisibility(flag);​
上一篇:通知小图标适配规范
下一篇:MIUI9通知过滤适配说明
文档内容是否有帮助?
有帮助
无帮助