分享

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

 太极混元天尊 2018-05-19

问题:

最近更新了最新的MIUI 9 系统,安装上公司的应用之后,发现之前适配过的沉浸式状态栏忽然没有效果了,感觉很郁闷的我于是去网上搜了一下关于小米手机状态栏适配方面的文章,发现大部分文章都还是之前的适配方案:

public void setStatusBarDarkMode(boolean darkmode, Activity activity) {        Class 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 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();        }}

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


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多