当前位置:主页 > 移动开发 > Android代码 >

详解关于MIUI 9沉浸式状态栏的最新适配

时间:2020-10-18 14:07:47 | 栏目:Android代码 | 点击:

问题:

最近更新了最新的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 自己做了一个接口。

2、在 Android 6.0 及以上版本,Android 提供了标准的方法实现「状态栏黑色字符」效果,但这个方法和 MIUI 的方法产生了冲突,以致于当开发者使用 Android 标准方法时,没有出现预期的效果,这给很多开发者都造成了困扰,尤其是海外开发者。

为了解决这个问题,小米觉决定在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();
  }
}

修改为以上代码之后,终于又看到了熟悉的沉浸式效果!

您可能感兴趣的文章:

相关文章