PopupMenu可见时检测键盘

时间:2014-04-05 20:36:48

标签: android popupmenu

我希望能够使用密钥(即数字1-4)从PopupMenu中选择一个选项。我正在编写应用程序的设备有一个内置的数字键盘,使它们始终可访问(不使用软键盘)。

目的是让用户能够按下一个数字/按钮,这里显示的菜单正常工作(这是我的活动中):

@Override
public boolean onKeyUp(int keyCode, KeyEvent event){
    Log.d("onKeyUp", KeyEvent.keyCodeToString(keyCode));
    if (event.getKeyCode() == KeyEvent.KEYCODE_5) {
        showPopupMenu((Button) findViewById(R.id.btnMenu));
    }
    return true;
}

我希望能够使用键盘从菜单中选择其中一个选项,但是当菜单可见时,只要按下某个键,就不会触发onKeyUp事件。

这是菜单代码:

public void showPopupMenu(View v){
    PopupMenu popupMenu = new PopupMenu(this, v);
    final MenuInflater menuInflator = popupMenu.getMenuInflater();

    popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem menuItem) {
            //Do something
            return true;
        }
    });

    menuInflator.inflate(R.menu.current_screen_menu, popupMenu.getMenu());
    popupMenu.show();
}

这是使用Android 4.1(API 16)。谢谢你的帮助!很高兴在需要的地方提供更多代码。

1 个答案:

答案 0 :(得分:0)

您需要在popupwindow对象中设置keyevent侦听器,如此

public void showPopupMenu(View v){
    PopupMenu popupMenu = new PopupMenu(this, v);
    final MenuInflater menuInflator = popupMenu.getMenuInflater();

    popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem menuItem) {
            //Do something
            return true;
        }
    });

    menuInflator.inflate(R.menu.current_screen_menu, popupMenu.getMenu());
    popupMenu.show();

    // You have to implement following listner
    popupMenu.getContentView().setOnKeyListener(new View.OnKeyListener() {        
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (keyCode ==  KeyEvent.KEYCODE_MENU && 
                    event.getRepeatCount() == 0 && 
                    event.getAction() == KeyEvent.ACTION_DOWN) {
                // ... payload action here. e.g. popupMenu.dismiss();
                return true;
            }                
            return false;
        }
    });
}