2014-04-05 49 views
0

我希望能够使用密钥(即数字1-4)从PopupMenu中选择一个选项。我正在编写应用程序的设备具有内置的数字小键盘,可以随时访问(不使用软键盘)。当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)。谢谢你的帮助!很高兴在需要的地方提供更多代码。

+0

你能找到一个方法来做到这一点?我正面临类似的问题! –

+0

嘿,抱歉不能说我能够得到这个工作。我最终通过使用一个简单而简单的'Dialog'来解决它,你可以找到http://developer.android.com/guide/topics/ui/dialogs.html – djston

回答

0

你需要设置的KeyEvent听众在popupwindow对象这样

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; 
     } 
    }); 
}