Android 如何做到隐藏手机底部虚拟按键?

本文介绍如何在Android应用中隐藏底部虚拟导航按键,并提供代码实现。适用于游戏或全屏应用等场景,确保用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现在的Android手机有好多底部带虚拟按键,比如华为、nexus、魅族等等,一般情况下对APP没啥影响,但是有时候就必须要强制隐藏。

例如:游戏的时候,拍照的时候。。。

接下来加上几个方法就OK 了,代码如下

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /**  
  2.  * 隐藏虚拟按键,并且设置成全屏  
  3.  */  
  4. protected void hideBottomUIMenu(){  
  5.     if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api  
  6.         View v = this.getWindow().getDecorView();  
  7.         v.setSystemUiVisibility(View.GONE);  
  8.     } else if (Build.VERSION.SDK_INT >= 19) {  
  9.         //for new api versions.  
  10.         View decorView = getWindow().getDecorView();  
  11.         int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE  
  12.                 | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION  
  13.                 | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN  
  14.                 | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar  
  15.                   | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar  
  16.                 | View.SYSTEM_UI_FLAG_IMMERSIVE;  
  17.         decorView.setSystemUiVisibility(uiOptions);  
  18.         getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);  
  19.     }  
  20. }  

反编译framework-res.apk(可在手机中system/framework/文件夹中找到),打开res/values/bools.xml


[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /**  
  2.      * 检查是否存在虚拟按键栏  
  3.      * @param context  
  4.      * @return  
  5.      */  
  6.     public static boolean hasNavBar(Context context) {  
  7.         Resources res = context.getResources();  
  8. //这种方式一定要注意写法要正确,内部应该是通过反射去调用的。
  9.         int resourceId = res.getIdentifier("config_showNavigationBar", "bool", "android");  
  10.         if (resourceId != 0) {  
  11.             boolean hasNav = res.getBoolean(resourceId);  
  12.             // check override flag  
  13.             String sNavBarOverride = getNavBarOverride();  
  14.             if ("1".equals(sNavBarOverride)) {  
  15.                 hasNav = false;  
  16.             } else if ("0".equals(sNavBarOverride)) {  
  17.                 hasNav = true;  
  18.             }  
  19.             return hasNav;  
  20.         } else { // fallback  
  21.             return !ViewConfiguration.get(context).hasPermanentMenuKey();  
  22.         }  
  23.     }  
  24.   
  25.     /**  
  26.      * 判断虚拟按键栏是否重写  
  27.      * @return  
  28.      */  
  29.     private static String getNavBarOverride() {  
  30.         String sNavBarOverride = null;  
  31.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {  
  32.             try {  
  33.                 Class c = Class.forName("android.os.SystemProperties");  
  34.                 Method m = c.getDeclaredMethod("get", String.class);  
  35.                 m.setAccessible(true);  
  36.                 sNavBarOverride = (String) m.invoke(null, "qemu.hw.mainkeys");  
  37.             } catch (Throwable e) {  
  38.             }  
  39.         }  
  40.         return sNavBarOverride;  
  41.     }  


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值