android 4.0 禁用系统home键


http://www.2cto.com/kf/201409/331118.html

http://blog.csdn.net/jdsjlzx/article/details/7026462


在Activity中重写onKeyDown方法,Menu键被屏蔽但HOME键未被屏蔽,其中还HOME屏蔽在我的另外一篇博客中已详细介绍,下面来解决Menu键被屏蔽,让其中MENU键有效。

屏蔽Android的menu键:

[java]  view plain  copy
  1. @Override  
  2.     public boolean onPrepareOptionsMenu(Menu menu) {  
  3.         Log.i(TAG, "groupList.size() = " + groupList.size());  
  4.         if(groupList.size() > 0){  
  5.             menu.add(0, MENU_EDITOR, 0"编辑");  
  6.             super.onPrepareOptionsMenu(menu);  
  7.         }  
  8.         return false;  
  9.     }  



防止 屏蔽menu键:

[java]  view plain  copy
  1. public boolean onKeyDown(int keyCode, KeyEvent event) {  
  2. if (keyCode == KeyEvent.KEYCODE_MENU) {  
  3.  super.openOptionsMenu();   
  4. }  
  5. return true;  
  6. }  


自定义menu:

[java]  view plain  copy
  1. @Override  
  2. /** 
  3. * 创建MENU 
  4. */  
  5. public boolean onCreateOptionsMenu(Menu menu) {  
  6. menu.add("menu");// 必须创建一项  
  7. return super.onCreateOptionsMenu(menu);  
  8. }  
  9.   
  10. @Override  
  11. /** 
  12. * 拦截MENU 
  13. */  
  14. public boolean onMenuOpened(int featureId, Menu menu) {  
  15. if (menuDialog == null) {  
  16. menuDialog = new AlertDialog.Builder(this).setView(menuView).show();  
  17. else {  
  18. menuDialog.show();  
  19. }  
  20. return false;// 返回为true 则显示系统menu  
  21. }  
  22.   
  23. menuGrid = (GridView) menuView.findViewById(R.id.gridview);  
  24. menuGrid.setAdapter(getMenuAdapter(menu_name_array, menu_image_array));  
  25. /** 监听menu选项 **/  
  26. menuGrid.setOnItemClickListener(new OnItemClickListener() {  
  27. public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,  
  28. long arg3) {  
  29. switch (arg2) {  
  30. case ITEM_SEARCH:// 搜索  
  31.   
  32. break;  
  33. case ITEM_FILE_MANAGER:// 文件管理  
  34.   
  35. break;  
  36. case ITEM_DOWN_MANAGER:// 下载管理  
  37.   
  38. break;  
  39. case ITEM_FULLSCREEN:// 全屏  
  40.   
  41. break;  
  42. case ITEM_MORE:// 翻页  
  43. if (isMore) {  
  44. menuGrid.setAdapter(getMenuAdapter(menu_name_array2,  
  45. menu_image_array2));  
  46. isMore = false;  
  47. else {// 首页  
  48. menuGrid.setAdapter(getMenuAdapter(menu_name_array,  
  49. menu_image_array));  
  50. isMore = true;  
  51. }  
  52. menuGrid.invalidate();// 更新menu  
  53. menuGrid.setSelection(ITEM_MORE);  
  54. break;  
  55. }  
  56.   
  57.   
  58. }  
  59. });  


2.2 禁用系统home键,这里不说了。

最近项目有一个需求,禁用系统的所有键,像menu, home, back.同时还要是想点击响应与view的弹出。就是UI这部分要正常。

back键我们自己onKeyDown 禁用的好开心。

个人认为最简单的写法请移步:

http://blog.csdn.net/yiding_he/article/details/38527813


这里关键说下4.0后禁用系统home键。

网上找了很久,基本上都是不能用的。因为都是说由于系统安全原因,android系统把这个事件(home,menu)在框架层就给吸收掉了,而且根本没有分发到应用层。

The Menu key can't be disabled for security reasons, this key is handled by the framework and is never delivered to applications. 

http://stackoverflow.com/questions/15459407/disable-home-button-in-android-4-0

看吧,老外的stack overflow上都说没办法。

就当我接近失望时,随便点进了一个搜索页中的某大神的github,https://github.com/shaobin0604/Android-HomeKey-Locker,随便下载试了下,竟然work了。

更重要的是这个大神是偶们中国人。太牛掰了。


膜拜,这里就不细说大神是怎么实现的了,秘诀是建立一个OverlayDialog, 给它设置了一些参数像FLAG_SHOW_WHEN_LOCKED,FLAG_NOT_TOUCH_MODAL等等。

有想研究的同学,请自行下载源码学习。

这里只说一下使用:

1.到https://github.com/shaobin0604/Android-HomeKey-Locker, 下载大神的代码。

2.HomeLockLib中的HomeKeyLocker.java放到自己的Util包下。

3.HomeLockLib中的styles中的OverlayDialog相关部分拷贝到自己的styles中。

4.在你自己的AndroidManifest中加入

5.在想要锁键的地方new HomeKeyLocker 对象。

?
1
2
private HomeKeyLocker mHomeKeyLocker;
mHomeKeyLocker = new HomeKeyLocker();


之后需要锁键使用:

mHomeKeyLocker.lock(mActivity.this);

解锁使用:

mHomeKeyLocker.unlock();

6.在自己的destroy方法中加入:

?
1
2
3
4
5
6
@Override
     protected void onDestroy() {
         super .onDestroy();
         mHomeKeyLocker.unlock();
         mHomeKeyLocker = null ;
     }


这样就可以开心的玩耍了。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值