- 浏览: 269805 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
androidios2014:
运行有滚没有把分组选项置顶,楼主帮忙给个源码学习7196628 ...
【so easy~】完全仿QQ好友列表,自定义ExpandableListView! -
hnu_hgc:
求代码,3243544018@qq.com
Android释放内存(结束进程) -
hnu_hgc:
求代码工程
Android释放内存(结束进程) -
l657757077:
楼主给个源码学习学习。邮箱:657757077@qq.com
【so easy~】完全仿QQ好友列表,自定义ExpandableListView! -
hao_yh:
楼主,修改后的代码能发我一份吗?感谢。感觉现在是只要界面创建就 ...
【so easy~】完全仿QQ好友列表,自定义ExpandableListView!
最近做了自定义菜单,许多阅读器的样子,都是点击屏幕中央弹出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设置下面的代码:
- //sub_view 是PopupWindow的子View
- sub_view.setFocusableInTouchMode(true);
- sub_view.setOnKeyListener(new OnKeyListener() {
- @Override
- public boolean onKey(View v, int keyCode, KeyEvent event) {
- // TODO Auto-generated method stub
- if ((keyCode == KeyEvent.KEYCODE_MENU)&&(mPopupWindow.isShowing())) {
- mPopupWindow.dismiss();// 这里写明模拟menu的PopupWindow退出就行
- return true;
- }
- return false;
- }
- });
记住,一定要给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)。这时候按键事件就响应了。。。
下面附上完整代码:
- /*必须重写,否则点击MENU无反应 为了让他不显示,下面onMenuOpened()必须返回false*/
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- menu.add("menu");// 必须创建一项
- return super.onCreateOptionsMenu(menu);
- }
- /**
- * 拦截MENU
- */
- @Override
- public boolean onMenuOpened(int featureId, Menu menu) {
- if(mPopupWindow != null){
- if(!mPopupWindow.isShowing()){
- /*最重要的一步:弹出显示 在指定的位置(parent) 最后两个参数 是相对于 x / y 轴的坐标*/
- mPopupWindow.showAtLocation(findViewById(R.id.linear_menu_parent), Gravity.BOTTOM, 0, 0);
- }
- }
- return false;// 返回为true 则显示系统menu
- }
- private void initPopuWindow(int menuViewID){
- LayoutInflater mLayoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
- /*设置显示menu布局 view子VIEW*/
- sub_view = mLayoutInflater.inflate(menuViewID, null);
- /*第一个参数弹出显示view 后两个是窗口大小*/
- mPopupWindow = new PopupWindow(sub_view, LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
- /*设置背景显示*/
- mPopupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.bg_menu_popup));
- /*设置触摸外面时消失*/
- mPopupWindow.setOutsideTouchable(true);
- /*设置系统动画*/
- mPopupWindow.setAnimationStyle(android.R.style.Animation_Dialog);
- mPopupWindow.update();
- mPopupWindow.setTouchable(true);
- /*设置点击menu以外其他地方以及返回键退出*/
- mPopupWindow.setFocusable(true);
- /** 1.解决再次点击MENU键无反应问题
- * 2.sub_view是PopupWindow的子View
- */
- sub_view.setFocusableInTouchMode(true);
- sub_view.setOnKeyListener(new OnKeyListener() {
- @Override
- public boolean onKey(View v, int keyCode, KeyEvent event) {
- // TODO Auto-generated method stub
- if ((keyCode == KeyEvent.KEYCODE_MENU)&&(mPopupWindow.isShowing())) {
- mPopupWindow.dismiss();// 这里写明模拟menu的PopupWindow退出就行
- return true;
- }
- return false;
- }
- });
- /*监听MENU事件*/
- menu = new View[3];
- menu[0] = sub_view.findViewById(R.id.menu_0);
- menu[1] = sub_view.findViewById(R.id.menu_1);
- menu[2] = sub_view.findViewById(R.id.menu_2);
- menu[0].setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // doSomething
- }
- });
- menu[1].setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // doSomething
- }
- });
- menu[2].setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // doSomething
- }
- });
- }
发表评论
-
【so easy】Android手动打包流程,完全详细版!
2012-08-09 12:19 5223由于是先写的word文档,所以排版不好,看不清的朋友可以直 ... -
转:Bitmap造成OOM的讨论与解决方案
2012-07-26 16:08 11226android BitmapFactory的OutOfM ... -
【so easy】Tabhost每个tab中放入多个Activity!
2012-04-25 18:14 5103最近做完了一个客户端项目 外面是个tabhost(用于底部t ... -
【so easy~】完全退出
2012-03-08 16:52 1729String packagename = getPac ... -
【BUG解决】WebView cookies清理
2012-03-05 15:21 12088今天在项目中发现一个BUG 在使用新浪微博账户登录应用时,w ... -
Project has no default.properties file! Edit the project properties to set one.
2012-02-20 14:02 1865导入新项目 有时会:Project has no def ... -
【so easy~】完全仿QQ好友列表,自定义ExpandableListView!
2012-01-10 16:14 25066最近,需要做一个可展开的listview,不禁想起了Expan ... -
【so easy~】正则表达式常用匹配
2012-01-03 09:31 4488http://androiddada.iteye.c ... -
Android释放内存(结束进程)
2011-12-30 15:45 10198这两天在搞个内存清理小插件,网上很少这方面资料,之前找过清 ... -
【so easy~】 Gallery 模仿Flash广告栏~!附源码
2011-12-19 16:24 5644先上个效果图~ http://androiddada.i ... -
android 获得手机信息
2011-12-02 14:22 1368Android中与电话功能相关的类是 Telephony ... -
【so easy~】 Webview离线功能(优先cache缓存+cache缓存管理)!
2011-11-28 17:05 39699在做Webview显示服务器的html功能时 需要加入离线功能 ... -
转!SQL:char、varchar、text和nchar、nvarchar、ntext的区别
2011-11-21 16:07 1767SQL:char、varchar、text和nchar、n ... -
【so easy~】 底部菜单可移动焦点~!(仿网易新闻等应用)
2011-11-18 10:51 3637最近比较懒惰,也没有更新博客。今天就把刚刚实现的一个小效果分享 ... -
转:shape 渐变!描边!圆角!漂亮的自定义背景
2011-11-09 09:47 3956在实现背景渐变的帖子里 http://androi ... -
ListView item渐变背景(ListView必备!)
2011-11-07 15:32 7167在看他人的代码学习时,无意中发现的。很多应用中的ListVi ... -
Android之系统自带的文字外观设置及实际显示效果图
2011-11-07 14:50 1306Android之系统自带的文字外观设置及实际显示效果图 ... -
【so easy~】 Intent实现 <分享>功能!~
2011-10-31 15:06 1530http://androiddada.iteye.com/ ... -
【so easy~】 GPS的那点儿事儿~!
2011-10-28 14:27 2042http://androiddada.iteye.com/ ... -
Service使用总结 与sdk部分翻译
2011-10-27 15:12 17101. Service SDK翻译 ...
相关推荐
Easy Context Menu 1.6是一款鼠标右键菜单管理器,通常在重装系统后,鼠标右键菜单项目很少,随着系统中软件安装越来越多,有些软件会自动在右键菜单中添加项目,时间长了这些项越来越多,冗长的项目会增加右键...
互联网资讯,技术简介,IT、AI技术,人工智能
自定义一个select组件,so easy~ 简单粗暴型: []> option作为数据进来就ok啦。 然后发现下列问题: key-value,不是所有的接口都是id-name option要disabled 怎么办? option存在几种情况怎么办? … 回头看看...
快捷生成json格式的微信公众号自定义菜单;Quickly generate the WeChat public custom menu in json format
"Easy Context Menu"是一款针对Windows系统的实用工具,其主要功能是帮助用户管理和优化电脑的右键菜单。在Windows操作系统中,右键菜单是用户经常使用的功能之一,它提供了快速访问各种命令和操作的途径。然而,...
"SoEasy办公效率平台"是一款专为提升个人和团队办公效率设计的应用软件。这款平台集成了多种实用功能,旨在简化日常办公任务,提高工作效率。作为一款"办公好助手",它可能包含了文档管理、项目协作、日程规划、任务...
jquery 自定义插件,模仿jquery easy ui,修改版
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 ...
SoEasy办公效率平台是一款办公人员必备工具。提供最易用、最集中、最专业OFFICE资源。 SoEasy办公效率平台功能: 1、包含Office中多个组件海量培训视频(Word,Excel,PowerPoint,Outlook等)。 2、文档及PPT...
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说明书
右键菜单管理 Easy Context Menu 1.6 Easy Context Menu一个小而有效的应用程序,包括对桌面右键菜单的一系列有益调整,你可以在我的电脑,硬盘,文件和文件夹的右键菜单中添加各种快捷方式。(新浪) 支持简体...
SoEasy办公效率平台,为提供办公人员办公必备工具,是全国最全面、最专业、最实用的办公辅助工具,专为提升办公能力,及办公效率的学习平台,由数名微软金牌讲师、资深顾问等组成的专家团队,以快速提升个人工作效率...
pygame_easy_menu支持自定义菜单的样式,包括字体、颜色、边框等。你可以通过`set_theme()`方法更改全局主题,或者为单个菜单项设置个性化样式。 4. **事件处理**: 库会自动处理鼠标和键盘事件,只需关注你的...
物联网So Easy 基于Blynk平台的IOT项目实践 配套资源 本书是经典的、畅销的Spring学习和实践指南。第5版针对Spring 5进行了全面更新。第5版涵盖了Spring 5.0和Spring Boot 2.0里程碑式的更新。 全书分为5个部分,...
Office资源宝库-SoEasy办公效率平台,是一款实用的办公辅助软件,辅助办公人员更好的应用ppt、excel、word等办公软件。软件提供视频教程、模板、图片、vba开发的小工具、各种文档资源、在线求助等功能。免费下载。
【纯绿色 免安装 完全免费 功能丰富】 1、特有的双视图浏览模式,浏览文件更加方便快捷,视图间文件夹与文件可以互相传送; 2、支持一般的文件操作,如搜索、复制、移动、改名、删除、新建文件夹等功能应有尽有;...
5. **组件特定样式**:对于特定的 EasyUI 组件(如对话框、表格、菜单等),你可能需要定位到对应的 CSS 类名进行定制。例如,修改 `.datagrid-header` 或 `.dialog-title` 类来改变表格和对话框的头部样式。 6. **...
`EasyTabs`库就是为了帮助开发者快速、简便地创建自定义选项卡控件而诞生的。它允许开发者以最少的代码量实现丰富的选项卡效果,提升应用的用户体验。本文将深入探讨`EasyTabs`的使用方法、特点以及如何将其集成到您...
《Unity游戏开发中的数据保存与恢复:EasySave3深度解析》 在Unity游戏开发中,数据保存和恢复是不可或缺的功能,特别是在角色扮演游戏、策略游戏或任何有进度和玩家状态的游戏类型中。EasySave系列插件为此提供了...