`
libo19881179
  • 浏览: 269805 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【so easy~】自定义上下menu菜单

阅读更多

 

最近做了自定义菜单,许多阅读器的样子,都是点击屏幕中央弹出menu(上下俩个)



直接说说思路吧,

1,利用PopupWindow来代替系统的menu(系统的样式死板,不可修改)。

2,上下两个菜单实际上是一个PopupWindow,因为同时弹出两个PopupWindow不能同时消失(如果能解决这个问题也可以直接弹出两个或多个PopupWindow)。

3,因为上下条menu,中部需要 放一个透明的区域,设置监听,点击dismiss。

 

下面直接使用了一位网友的例子:

使用PopupWindow来做自定义menu,往PopupWindow增加一个子View,子View的布局就是menu的布局。

出现和退出的动画:可以给PopUpWindow或它的子view添加。

网上所有用PopupWindow做的menu有个共同特点:就是点击menu键出现PopupWindow,然后再点击menu键无法使PopupWindow退出/dismiss()。

当给PopupWindow设置了setFocusable(true),menu显示后,点击menu其他任何地方,menu都会消失,但是这时候按钮的点击事件其实是不响应的。同时只响应键盘的返回键,其他按键均不响应,比如点击menu键,没有任何反应。

要解决这个问题很简单,就是给PopupWindow的子View设置下面的代码:

[java] view plaincopy
  1. //sub_view 是PopupWindow的子View  
  2. sub_view.setFocusableInTouchMode(true);  
  3. sub_view.setOnKeyListener(new OnKeyListener() {  
  4.     @Override  
  5.     public boolean onKey(View v, int keyCode, KeyEvent event) {  
  6.         // TODO Auto-generated method stub  
  7.         if ((keyCode == KeyEvent.KEYCODE_MENU)&&(mPopupWindow.isShowing())) {  
  8.             mPopupWindow.dismiss();// 这里写明模拟menu的PopupWindow退出就行  
  9.             return true;  
  10.         }  
  11.         return false;  
  12.     }  
  13. });  

 


 记住,一定要给PopupWindow设置setFocusable(true),要不然点击menu其他地方以及返回键,menu都不会退出。且这时候是响应PopupWindow的parent的menu事件的。

下面阐述为什么这么写之后,当PopupWindow显示后,点击menu键PopupWindow会退出的原因:

首先得明白为什么给PopupWindow setFocusable(true)后,点击menu出现PopupWindow后再点击menu没反应的原因。

PopupWindow初始化的时候一般都指定了在哪个View上出现,我们称这个View为parent。parent里面写了点击menu出现PopupWindow的事件,如果给PopupWindow setFocusable(true),此时屏幕的焦点在PopupWindow上面,肯定是不会响应parent的按键事件的,它只会响应PopupWindow的按键事件。

但是PopupWindow的本质是Window,没有继承View类,自己没有onkeyDown或onkey或dispatchKey这些事件的。我刚开始试着实现这些接口,但是按键依然不响应,不知原因。因现在对按键的原理还不熟,无法阐述其原因。

然后我想绕道而行,就是给PopupWindow的子View注册按键事件,setKeyListener,刚开始我在子View的xml设置了android:focusable=”true” 但按键事件依然不响应。。。。纠结啊纠结。。。然后没得办法,我google了所有关于PopupWindow的文章。。。最后终于被我发现。。。需要给PopupWindow的子View 设置setFocusableInTouchMode(true)。这时候按键事件就响应了。。。

 

下面附上完整代码:

[java] view plaincopy
  1.    /*必须重写,否则点击MENU无反应  为了让他不显示,下面onMenuOpened()必须返回false*/  
  2. @Override  
  3. public boolean onCreateOptionsMenu(Menu menu) {  
  4.     menu.add("menu");// 必须创建一项  
  5.     return super.onCreateOptionsMenu(menu);  
  6. }  
  7. /** 
  8.  * 拦截MENU 
  9.  */  
  10. @Override  
  11. public boolean onMenuOpened(int featureId, Menu menu) {  
  12.     if(mPopupWindow != null){  
  13.         if(!mPopupWindow.isShowing()){  
  14.             /*最重要的一步:弹出显示   在指定的位置(parent)  最后两个参数 是相对于 x / y 轴的坐标*/  
  15.             mPopupWindow.showAtLocation(findViewById(R.id.linear_menu_parent), Gravity.BOTTOM, 00);  
  16.         }  
  17.     }  
  18.     return false;// 返回为true 则显示系统menu  
  19. }  
  20.   
  21.      
  22.    private void initPopuWindow(int menuViewID){  
  23.     LayoutInflater mLayoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);  
  24.     /*设置显示menu布局   view子VIEW*/  
  25.     sub_view = mLayoutInflater.inflate(menuViewID, null);  
  26.     /*第一个参数弹出显示view  后两个是窗口大小*/  
  27.     mPopupWindow = new PopupWindow(sub_view, LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);  
  28.     /*设置背景显示*/  
  29.     mPopupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.bg_menu_popup));  
  30.     /*设置触摸外面时消失*/  
  31.     mPopupWindow.setOutsideTouchable(true);  
  32.     /*设置系统动画*/  
  33.     mPopupWindow.setAnimationStyle(android.R.style.Animation_Dialog);  
  34.     mPopupWindow.update();  
  35.     mPopupWindow.setTouchable(true);  
  36.     /*设置点击menu以外其他地方以及返回键退出*/  
  37.     mPopupWindow.setFocusable(true);  
  38.       
  39.     /** 1.解决再次点击MENU键无反应问题   
  40.      *  2.sub_view是PopupWindow的子View 
  41.      */  
  42.     sub_view.setFocusableInTouchMode(true);  
  43.     sub_view.setOnKeyListener(new OnKeyListener() {  
  44.         @Override  
  45.         public boolean onKey(View v, int keyCode, KeyEvent event) {  
  46.             // TODO Auto-generated method stub  
  47.             if ((keyCode == KeyEvent.KEYCODE_MENU)&&(mPopupWindow.isShowing())) {  
  48.                 mPopupWindow.dismiss();// 这里写明模拟menu的PopupWindow退出就行  
  49.                 return true;  
  50.             }  
  51.             return false;  
  52.         }  
  53.     });  
  54.       
  55.       
  56.     /*监听MENU事件*/  
  57.     menu = new View[3];  
  58.     menu[0] = sub_view.findViewById(R.id.menu_0);  
  59.     menu[1] = sub_view.findViewById(R.id.menu_1);  
  60.     menu[2] = sub_view.findViewById(R.id.menu_2);  
  61.       
  62.     menu[0].setOnClickListener(new OnClickListener() {  
  63.         @Override  
  64.         public void onClick(View v) {  
  65.             // doSomething  
  66.               
  67.         }  
  68.     });  
  69.       
  70.     menu[1].setOnClickListener(new OnClickListener() {  
  71.         @Override  
  72.         public void onClick(View v) {  
  73.             // doSomething  
  74.               
  75.         }  
  76.     });  
  77.       
  78.     menu[2].setOnClickListener(new OnClickListener() {  
  79.         @Override  
  80.         public void onClick(View v) {  
  81.             // doSomething  
  82.               
  83.         }  
  84.     });  
  85.    }  

 

  • 大小: 87.2 KB
分享到:
评论

相关推荐

    Easy Context Menu 1.6(右键菜单管理工具)中文版.zip

    Easy Context Menu 1.6是一款鼠标右键菜单管理器,通常在重装系统后,鼠标右键菜单项目很少,随着系统中软件安装越来越多,有些软件会自动在右键菜单中添加项目,时间长了这些项越来越多,冗长的项目会增加右键...

    [] - 2022-09-27 Spring Boot + minio 实现高性能存储服务,So Easy~!.pdf

    互联网资讯,技术简介,IT、AI技术,人工智能

    详解Vue实战指南之依赖注入(provide/inject)

    自定义一个select组件,so easy~ 简单粗暴型: []> option作为数据进来就ok啦。 然后发现下列问题: key-value,不是所有的接口都是id-name option要disabled 怎么办? option存在几种情况怎么办? … 回头看看...

    快捷生成json格式的微信公众号自定义菜单

    快捷生成json格式的微信公众号自定义菜单;Quickly generate the WeChat public custom menu in json format

    easy context menu

    "Easy Context Menu"是一款针对Windows系统的实用工具,其主要功能是帮助用户管理和优化电脑的右键菜单。在Windows操作系统中,右键菜单是用户经常使用的功能之一,它提供了快速访问各种命令和操作的途径。然而,...

    SoEasy办公效率平台

    "SoEasy办公效率平台"是一款专为提升个人和团队办公效率设计的应用软件。这款平台集成了多种实用功能,旨在简化日常办公任务,提高工作效率。作为一款"办公好助手",它可能包含了文档管理、项目协作、日程规划、任务...

    jquery 自定义插件,模仿jquery easy ui,修改版

    jquery 自定义插件,模仿jquery easy ui,修改版

    Easy Main Menu 1.0f

    Easy Main Menu is your one stop solution for all the things you want to have in a menu : - Start Game * New Game * Save/Load Game - Options * Game Options * Graphics Options * Control ...

    Office资源宝库SoEasy办公效率平台 v4.0.11.5.exe

    SoEasy办公效率平台是一款办公人员必备工具。提供最易用、最集中、最专业OFFICE资源。   SoEasy办公效率平台功能: 1、包含Office中多个组件海量培训视频(Word,Excel,PowerPoint,Outlook等)。 2、文档及PPT...

    Android代码-自定义上下左右是否显示圆角的一个库,可以看作 CardView 的灵活实现

    Here has a demo apk, and it's source code, very easy to understand~ API setColor(int color) setElevation(float elevationDp) setRadius(float radiusDp) setRipple(int mask) only work for API 21 ....

    温度报警器SOEASY2010说明书

    温度报警器SOEASY2010说明书

    右键菜单管理 Easy Context Menu 1.6

    右键菜单管理 Easy Context Menu 1.6  Easy Context Menu一个小而有效的应用程序,包括对桌面右键菜单的一系列有益调整,你可以在我的电脑,硬盘,文件和文件夹的右键菜单中添加各种快捷方式。(新浪)  支持简体...

    soeasy软件

    SoEasy办公效率平台,为提供办公人员办公必备工具,是全国最全面、最专业、最实用的办公辅助工具,专为提升办公能力,及办公效率的学习平台,由数名微软金牌讲师、资深顾问等组成的专家团队,以快速提升个人工作效率...

    Python库 | pygame_easy_menu-0.0.11-py3-none-any.whl

    pygame_easy_menu支持自定义菜单的样式,包括字体、颜色、边框等。你可以通过`set_theme()`方法更改全局主题,或者为单个菜单项设置个性化样式。 4. **事件处理**: 库会自动处理鼠标和键盘事件,只需关注你的...

    物联网So Easy 基于Blynk平台的IOT项目实践 配套资源

    物联网So Easy 基于Blynk平台的IOT项目实践 配套资源 本书是经典的、畅销的Spring学习和实践指南。第5版针对Spring 5进行了全面更新。第5版涵盖了Spring 5.0和Spring Boot 2.0里程碑式的更新。 全书分为5个部分,...

    Office资源宝库-SoEasy办公效率平台

    Office资源宝库-SoEasy办公效率平台,是一款实用的办公辅助软件,辅助办公人员更好的应用ppt、excel、word等办公软件。软件提供视频教程、模板、图片、vba开发的小工具、各种文档资源、在线求助等功能。免费下载。

    SoEasy资源管理器

    【纯绿色 免安装 完全免费 功能丰富】 1、特有的双视图浏览模式,浏览文件更加方便快捷,视图间文件夹与文件可以互相传送; 2、支持一般的文件操作,如搜索、复制、移动、改名、删除、新建文件夹等功能应有尽有;...

    jquery easy-ui 自定义皮肤

    5. **组件特定样式**:对于特定的 EasyUI 组件(如对话框、表格、菜单等),你可能需要定位到对应的 CSS 类名进行定制。例如,修改 `.datagrid-header` 或 `.dialog-title` 类来改变表格和对话框的头部样式。 6. **...

    Android-EasyTabs让您可以轻松实现自定义选项卡控件

    `EasyTabs`库就是为了帮助开发者快速、简便地创建自定义选项卡控件而诞生的。它允许开发者以最少的代码量实现丰富的选项卡效果,提升应用的用户体验。本文将深入探讨`EasyTabs`的使用方法、特点以及如何将其集成到您...

    EasySave3.unitypackage

    《Unity游戏开发中的数据保存与恢复:EasySave3深度解析》 在Unity游戏开发中,数据保存和恢复是不可或缺的功能,特别是在角色扮演游戏、策略游戏或任何有进度和玩家状态的游戏类型中。EasySave系列插件为此提供了...

Global site tag (gtag.js) - Google Analytics