安卓如何设置沉浸式状态栏,注意处理华为等有虚拟按键的问题

来源:互联网 发布:广州数控车床编程图纸 编辑:程序博客网 时间:2024/06/06 13:50

当前安卓开发中,基本都使用了沉浸时候状态栏,拉伸视觉体验,增大了屏幕空间,但是如何设置沉浸式状态栏呢,这里简单进行介绍:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {    activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);    activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);}
使用上面几行代码就可以实现沉浸式效果,但是在适配小米和魅族等有虚拟按键和自己风格的手机时,会出现沉浸式没有效果,或者手机原有的虚拟按钮把底部的导航栏这改的额问题,为了处理这个问题,我们需要先单独给他们进行处理:

public static boolean setMiuiStatusBarDarkMode(Activity activity, boolean darkmode) {    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 extraFlags = clazz.getMethod("setExtraFlags", int.class, int.class);        extraFlags.invoke(activity.getWindow(), darkmode ? darkModeFlag : 0, darkModeFlag);        return true;    } catch (Exception e) {        e.printStackTrace();    }    return false;}public static boolean setMeizuStatusDarkIcon(Activity activity, boolean b) {    boolean result = false;    if (activity != null) {        try {            WindowManager.LayoutParams lp = activity.getWindow().getAttributes();            Field darkFlag = WindowManager.LayoutParams.class                    .getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");            Field meizuFlags = WindowManager.LayoutParams.class                    .getDeclaredField("meizuFlags");            darkFlag.setAccessible(true);            meizuFlags.setAccessible(true);            int bit = darkFlag.getInt(null);            int value = meizuFlags.getInt(lp);            if (b) {                value |= bit;            } else {                value &= ~bit;            }            meizuFlags.setInt(lp, value);            activity.getWindow().setAttributes(lp);            result = true;        } catch (Exception e) {            e.printStackTrace();        }    }    return result;}
上面是处理魅族和小米系统的方法,但是还不能处理有虚拟键盘的情况,下面就来说一下如何处理:

@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)public static boolean hasSoftKeys(WindowManager windowManager) {    Display display = windowManager.getDefaultDisplay();    DisplayMetrics realDisplayMetrics = new DisplayMetrics();    display.getRealMetrics(realDisplayMetrics);    int realHeight = realDisplayMetrics.heightPixels;    int realWidth = realDisplayMetrics.widthPixels;    DisplayMetrics displayMetrics = new DisplayMetrics();    display.getMetrics(displayMetrics);    int disHeight = displayMetrics.heightPixels;    int disWidth = displayMetrics.widthPixels;    return (realWidth - disWidth) > 0 || (realHeight - disHeight) > 0;}
这样一来,基本就够用了,下面说一下,如何使用

public static void setStatus(Activity activity) {    setMeizuStatusDarkIcon(activity, true);    setMiuiStatusBarDarkMode(activity, true);    if (hasSoftKeys(activity.getWindowManager())) {        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {            // 透明状态栏            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);        }    } else {        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);        }    }}
我是把这些方法封装在一个方法中,使用的时候直接调用就可以了。现在你也可以试试,去做一个沉浸式了

原创粉丝点击