Android: How can I set a listener to the MenuButton?

梦想的初衷 提交于 2019-11-27 17:38:09

问题


I want to do a custom action when pressing on the Menu button on the phone.

Is it possible to set an onClickListener (or similar) on the button and if so, how?

onCreateOptionsMenu is only called the first time the button is pressed - I've already tried this.


回答1:


Usually you shouldn't override MENU behavior as users expect menu to appear, however you can use something along these lines:

/* (non-Javadoc)
 * @see android.app.Activity#onKeyDown(int, android.view.KeyEvent)
 */
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ( keyCode == KeyEvent.KEYCODE_MENU ) {
        Log.d(TAG, "MENU pressed");
        return true;
    }
    return super.onKeyDown(keyCode, event);
}



回答2:


But onPrepareOptionsMenu(..) is called each time. :)




回答3:


Updated for AppCompat v.22.+

As mentioned in this forum, KeyDown is not called for KEYCODE_MENU button pressed.

The solution is to override dispatchKeyEvent to this way:

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    int keyCode = event.getKeyCode();
    int action = event.getAction();
    boolean isDown = action == KeyEvent.ACTION_DOWN;

    if (keyCode == KeyEvent.KEYCODE_MENU) {
        return isDown ? this.onKeyDown(keyCode, event) : this.onKeyUp(keyCode, event);
    }

    return super.dispatchKeyEvent(event);
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {

    if ( keyCode == KeyEvent.KEYCODE_MENU ) {
        // do what you want to do here
        return true;
    }

    return super.onKeyDown(keyCode, event);
}

It works until Google developers release a fix for this (or maybe it is not a bug and it works this way from now on).




回答4:


You could probably hack something in using "OnMenuOpened" or some such, but I really wouldn't recommend it. The menu button is only supposed to be used to show menus, so there is consistency between applications.



来源:https://stackoverflow.com/questions/2478418/android-how-can-i-set-a-listener-to-the-menubutton

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!