- 浏览: 271263 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
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 5252由于是先写的word文档,所以排版不好,看不清的朋友可以直 ... -
转:Bitmap造成OOM的讨论与解决方案
2012-07-26 16:08 11268android BitmapFactory的OutOfM ... -
【so easy】Tabhost每个tab中放入多个Activity!
2012-04-25 18:14 5123最近做完了一个客户端项目 外面是个tabhost(用于底部t ... -
【so easy~】完全退出
2012-03-08 16:52 1762String packagename = getPac ... -
【BUG解决】WebView cookies清理
2012-03-05 15:21 12134今天在项目中发现一个BUG 在使用新浪微博账户登录应用时,w ... -
Project has no default.properties file! Edit the project properties to set one.
2012-02-20 14:02 1880导入新项目 有时会:Project has no def ... -
【so easy~】完全仿QQ好友列表,自定义ExpandableListView!
2012-01-10 16:14 25127最近,需要做一个可展开的listview,不禁想起了Expan ... -
【so easy~】正则表达式常用匹配
2012-01-03 09:31 4509http://androiddada.iteye.c ... -
Android释放内存(结束进程)
2011-12-30 15:45 10220这两天在搞个内存清理小插件,网上很少这方面资料,之前找过清 ... -
【so easy~】 Gallery 模仿Flash广告栏~!附源码
2011-12-19 16:24 5683先上个效果图~ http://androiddada.i ... -
android 获得手机信息
2011-12-02 14:22 1392Android中与电话功能相关的类是 Telephony ... -
【so easy~】 Webview离线功能(优先cache缓存+cache缓存管理)!
2011-11-28 17:05 39731在做Webview显示服务器的html功能时 需要加入离线功能 ... -
转!SQL:char、varchar、text和nchar、nvarchar、ntext的区别
2011-11-21 16:07 1790SQL:char、varchar、text和nchar、n ... -
【so easy~】 底部菜单可移动焦点~!(仿网易新闻等应用)
2011-11-18 10:51 3692最近比较懒惰,也没有更新博客。今天就把刚刚实现的一个小效果分享 ... -
转:shape 渐变!描边!圆角!漂亮的自定义背景
2011-11-09 09:47 3985在实现背景渐变的帖子里 http://androi ... -
ListView item渐变背景(ListView必备!)
2011-11-07 15:32 7226在看他人的代码学习时,无意中发现的。很多应用中的ListVi ... -
Android之系统自带的文字外观设置及实际显示效果图
2011-11-07 14:50 1348Android之系统自带的文字外观设置及实际显示效果图 ... -
【so easy~】 Intent实现 <分享>功能!~
2011-10-31 15:06 1543http://androiddada.iteye.com/ ... -
【so easy~】 GPS的那点儿事儿~!
2011-10-28 14:27 2058http://androiddada.iteye.com/ ... -
Service使用总结 与sdk部分翻译
2011-10-27 15:12 17511. 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,修改版
物联网So Easy 基于Blynk平台的IOT项目实践 配套资源 本书是经典的、畅销的Spring学习和实践指南。第5版针对Spring 5进行了全面更新。第5版涵盖了Spring 5.0和Spring Boot 2.0里程碑式的更新。 全书分为5个部分,...
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. **事件处理**: 库会自动处理鼠标和键盘事件,只需关注你的...
Office资源宝库-SoEasy办公效率平台,是一款实用的办公辅助软件,辅助办公人员更好的应用ppt、excel、word等办公软件。软件提供视频教程、模板、图片、vba开发的小工具、各种文档资源、在线求助等功能。免费下载。
Vue Easytable提供了自定义渲染(render)和数据处理(data processing)的方法来实现复杂的表格布局,包括单元格合并。 首先,理解Vue Easytable的基本使用。创建一个表格通常需要定义列(columns)和数据(data)...
【纯绿色 免安装 完全免费 功能丰富】 1、特有的双视图浏览模式,浏览文件更加方便快捷,视图间文件夹与文件可以互相传送; 2、支持一般的文件操作,如搜索、复制、移动、改名、删除、新建文件夹等功能应有尽有;...
5. **组件特定样式**:对于特定的 EasyUI 组件(如对话框、表格、菜单等),你可能需要定位到对应的 CSS 类名进行定制。例如,修改 `.datagrid-header` 或 `.dialog-title` 类来改变表格和对话框的头部样式。 6. **...
Easy Save - The Complete Save Data Serializer System 3.5.6.unity