现在的Android手机有好多底部带虚拟按键,比如华为、nexus、魅族等等,一般情况下对APP没啥影响,但是有时候就必须要强制隐藏。
例如:游戏的时候,拍照的时候。。。
接下来加上几个方法就OK 了,代码如下
- /**
- * 隐藏虚拟按键,并且设置成全屏
- */
- protected void hideBottomUIMenu(){
- if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api
- View v = this.getWindow().getDecorView();
- v.setSystemUiVisibility(View.GONE);
- } else if (Build.VERSION.SDK_INT >= 19) {
- //for new api versions.
- View decorView = getWindow().getDecorView();
- int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
- | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
- | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
- | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
- | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
- | View.SYSTEM_UI_FLAG_IMMERSIVE;
- decorView.setSystemUiVisibility(uiOptions);
- getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
- }
- }
反编译framework-res.apk(可在手机中system/framework/文件夹中找到),打开res/values/bools.xml
- /**
- * 检查是否存在虚拟按键栏
- * @param context
- * @return
- */
- public static boolean hasNavBar(Context context) {
- Resources res = context.getResources();
- //这种方式一定要注意写法要正确,内部应该是通过反射去调用的。
- int resourceId = res.getIdentifier("config_showNavigationBar", "bool", "android");
- if (resourceId != 0) {
- boolean hasNav = res.getBoolean(resourceId);
- // check override flag
- String sNavBarOverride = getNavBarOverride();
- if ("1".equals(sNavBarOverride)) {
- hasNav = false;
- } else if ("0".equals(sNavBarOverride)) {
- hasNav = true;
- }
- return hasNav;
- } else { // fallback
- return !ViewConfiguration.get(context).hasPermanentMenuKey();
- }
- }
- /**
- * 判断虚拟按键栏是否重写
- * @return
- */
- private static String getNavBarOverride() {
- String sNavBarOverride = null;
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
- try {
- Class c = Class.forName("android.os.SystemProperties");
- Method m = c.getDeclaredMethod("get", String.class);
- m.setAccessible(true);
- sNavBarOverride = (String) m.invoke(null, "qemu.hw.mainkeys");
- } catch (Throwable e) {
- }
- }
- return sNavBarOverride;
- }