Menu键控制PopupMenu的相关bug及其避免方法
来源:互联网 发布:军工软件股票 编辑:程序博客网 时间:2024/06/01 10:22
1.通过menu键控制的菜单从下弹出,如图1-1所示:核心代码是调用Activity的接口以及xml文件的menu
public boolean onCreateOptionsMenu(Menu menu){getMenuInflater().inflate(R.menu.main, menu);return true;}public boolean onMenuItemSelected(intfeatureId, MenuItem item){witch(item.getItemId()) {case Item.ID1://do somethingbreak;case Item.ID2://do somethingbreak;//......default:break;}return super.onMenuItemSelected(featureId, item);}
2.通过屏幕上某个按钮调用下拉框式的popupmenu,如图1-2所示:(下图使用的是自定义的actionbar,不能使用menu键来控制这个的Popupmenu。如果是系统默认的actionbar则可以通过menu键直接控制一个默认样式的下拉式menu)
故该图中样式的menu核心代码是使用Popupmenu类来实现。
btn_popUp = (Button) findViewById(R.id.btn_popUp);btn_popUp.setOnClickListener(newOnClickListener(){public void onClick(View v) {PopupMenu popup = newPopupMenu(MenuActivity2.this, v);popup.getMenuInflater().inflate(R.menu.menu_activity2);popup.getMenu());popup.setOnMenuItemClickListener(MenuActivity2.this); //设置点击菜单选项事件popup.show();//显示菜单}});
3.那么问题来了:如果想用menu键实现控屏幕上某个按钮的下拉框式的popupmenu该怎么办呢?首先可以肯定的是调用了onKeyDown()。那如下代码就可以了?
public boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_MENU && event.getRepeatCount() == 0) {if (mEnableMenu) {if (!mMenuExist) {createMenu(mSettingButton);}popup.show();//显示菜单}}return super.onKeyDown(keyCode, event);}
实际尝试后并不行,为什么?因为在调用popup.show()的时候android居然会主动调用onKeyUp()事件,以至于当真正调用onKeyUp()的时候,同时执行了popup. Dismiss();此时产生bug,即手指按下,弹出popupmenu,手指抬起时popupmenu消失。
那么应该怎么做呢?应该使用PopupWindows类来自定义Popupmenu事件。核心代码如下:
public void createMenu(ImageButton settingButton) {mPopupMenu = new PopupWindow(getLayoutInflater().inflate(R.layout.listview_menu, null));menuList = (ListView) mPopupMenu.getContentView().findViewById(R.id.listview_menu);final ArrayList<String> menuStr = new ArrayList<String>();menuStr.add(mContext.getResources().getString(R.string.abc));menuStr.add(mContext.getResources().getString(R.string.bca));ArrayAdapter<String> menuAdapter = new ArrayAdapter<String>(mContext, R.layout.popupmenu_item,menuStr);menuList.setAdapter(menuAdapter);menuList.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {//do something}});mPopupMenu.setWidth(LayoutParams.WRAP_CONTENT);mPopupMenu.setHeight(LayoutParams.WRAP_CONTENT);mPopupMenu.setFocusable(true);//只有设置了背景之后,点击popupwindows之外的空白处,popupwindows消失,否则绝不消失,试过其他正规非正规的手段。//如果不设置背景,那么即便监听back键事件主动调用dimission也不会消失。mPopupMenu.setBackgroundDrawable(mContext.getResources().getDrawable(R.drawable.pupopmenu_bg));mPopupMenu.setOutsideTouchable(true);mMenuExist = true;//焦点在popupmenu中,此时若点击menu键无响应,故需要设置监听响应menu.disiss()事件menuList.setOnKeyListener(new OnKeyListener() {@Overridepublic boolean onKey(View v, int keyCode, KeyEvent event) {// TODO Auto-generated method stubif (keyCode == KeyEvent.KEYCODE_MENU&& event.getAction() == KeyEvent.ACTION_DOWN) {mPopupMenu.dismiss();}return true;}});}
0 0
- Menu键控制PopupMenu的相关bug及其避免方法
- Android菜单Menu,PopupMenu的使用
- STM32F103xCDE系列的FSMC多主访问冲突的bug相关描述和避免方法
- popupmenu and menu
- 野指针及其有效的避免方法
- 上下键控制音乐的开关
- 菜单键控制navigation drawer的滑入滑出
- NetCms修改之三:相关新闻的Bug及其修正
- 【matlab】GUI 中使用Popupmenu遇到的问题及其解决办法
- 僵尸进程及其避免方法
- lua metatable及其相关方法的简述
- Android应用程序避免Context相关的内存泄露的方法
- 基础二:ContextMenu,Option Menu和PopupMenu
- j2me的键控处理
- Map的keySet方法序列化BUG问题及其解决方法
- IEbug:20个常见的bug及其修复方法
- 标准键盘上的所有键,及其相应的键控代码值和 ASCII
- 标准键盘上的所有键,及其相应的键控代码值和 ASCII
- 加速深根技术土壤,建立全面技术体系,转变思路方式,引创潮流新作。。。
- Mininet Host间流量测试
- 关于PHP的set_include_path()函数
- shouldAutorotateToInterfaceOrientation 不触发或者不执行的问题
- 【数据结构之二叉树】(三)B-树和B+树的应用:数据搜索和数据库索引
- Menu键控制PopupMenu的相关bug及其避免方法
- pullToRefreshView下拉刷新上拉加载
- Web App 框架选择之百度&腾讯
- 杭电 HDU 1236 排名
- HttpClient获取并解析JSON数据
- EditPlus安装使用
- 基于XMPP的IOS聊天客户端程序(IOS端一)
- 基于XMPP的IOS聊天客户端程序(IOS端二)
- j-link修复 write flash 一直无法点击