`
libo19881179
  • 浏览: 271263 次
  • 性别: 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,修改版

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

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

    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. **事件处理**: 库会自动处理鼠标和键盘事件,只需关注你的...

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

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

    vue-easytable合并单元格

    Vue Easytable提供了自定义渲染(render)和数据处理(data processing)的方法来实现复杂的表格布局,包括单元格合并。 首先,理解Vue Easytable的基本使用。创建一个表格通常需要定义列(columns)和数据(data)...

    SoEasy资源管理器

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

    jquery easy-ui 自定义皮肤

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

    Easy Save - The Complete Save Data Serializer System 3.5.6

    Easy Save - The Complete Save Data Serializer System 3.5.6.unity

Global site tag (gtag.js) - Google Analytics