14

我想在按下Menu手机上的按钮时执行自定义操作。

是否可以在按钮上设置 onClickListener (或类似的),如果可以,如何设置?

onCreateOptionsMenu仅在第一次按下按钮时调用 - 我已经尝试过了。

4

4 回答 4

30

通常您不应该覆盖MENU用户期望菜单出现的行为,但是您可以使用以下内容:

/* (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);
}
于 2010-03-19T15:37:06.397 回答
19

但是onPrepareOptionsMenu(..)每次都被调用。:)

于 2010-03-19T15:27:15.630 回答
3

更新 AppCompat v.22.+

如本论坛所述,KeyDown按下 KEYCODE_MENU 按钮时不会调用。

解决方案是以这种方式覆盖dispatchKeyEvent

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

它一直有效,直到 Google 开发人员为此发布修复程序(或者它可能不是错误,并且从现在开始以这种方式工作)。

于 2015-04-29T09:51:46.583 回答
1

你可能会在使用“OnMenuOpened”或类似的东西时破解一些东西,但我真的不推荐它。菜单按钮应该只用于显示菜单,因此应用程序之间存在一致性。

于 2010-03-19T15:26:31.187 回答