问题:最近更新了最新的MIUI 9 系统,安装上公司的应用之后,发现之前适配过的沉浸式状态栏忽然没有效果了,感觉很郁闷的我于是去网上搜了一下关于小米手机状态栏适配方面的文章,发现大部分文章都还是之前的适配方案: 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(); }} 于是乎就自己去小米的开放平台逛了逛,然后就找到了问题所在: 1、在 Android 6.0 以前,Android 没有方法可以实现「状态栏黑色字符」效果,因此 MIUI 自己做了一个接口。 为了解决这个问题,小米觉决定在MIUI 9之后兼容Android 官方的标准方案,舍弃了自己的方案,所以说,对于MIUI9 以上版本的用户,对于手机状态栏深色字体的实现需要重新适配,小米官方也给出了最新的适配方案。 在新的 MIUI 版本(即基于 Android 6.0 ,开发版 7.7.13 及以后版本):状态栏深色字体: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); 状态栏白色字体: int flag = window.getDecorView().getSystemUiVisibility() & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;window.getDecorView().setSystemUiVisibility(flag); 但是为了继续适配之前的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); if(darkmode){ 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); }else{ int flag = activity.getWindow().getDecorView().getSystemUiVisibility() & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; window.getDecorView().setSystemUiVisibility(flag); } } catch (Exception e) { e.printStackTrace(); }} 修改为以上代码之后,终于又看到了熟悉的沉浸式效果! |
|