1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 安卓如何设置沉浸式状态栏 注意处理华为等有虚拟按键的问题

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

时间:2024-06-27 11:34:08

相关推荐

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

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

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); }}}

我是把这些方法封装在一个方法中,使用的时候直接调用就可以了。现在你也可以试试,去做一个沉浸式了

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。