当前安卓开发中,基本都使用了沉浸时候状态栏,拉伸视觉体验,增大了屏幕空间,但是如何设置沉浸式状态栏呢,这里简单进行介绍:
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); } } }我是把这些方法封装在一个方法中,使用的时候直接调用就可以了。现在你也可以试试,去做一个沉浸式了