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