Android: Как я могу настроить слушателя на кнопку MenuButton? - PullRequest
14 голосов
/ 19 марта 2010

Я хочу выполнить пользовательское действие при нажатии кнопки Menu на телефоне.

Можно ли установить onClickListener (или аналогичный) на кнопку и если да, то как?

onCreateOptionsMenu вызывается только при первом нажатии кнопки - я уже пробовал это.

Ответы [ 4 ]

30 голосов
/ 19 марта 2010

Обычно вам не следует переопределять поведение 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);
}
19 голосов
/ 19 марта 2010

Но onPrepareOptionsMenu(..) вызывается каждый раз. :)

3 голосов
/ 29 апреля 2015

Обновлено для 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 не выпустят исправление для этого (или, возможно, это не ошибка, и теперь это работает так).

1 голос
/ 19 марта 2010

Возможно, вы могли бы что-то взломать, используя "OnMenuOpened" или что-то подобное, но я действительно не рекомендовал бы это. Предполагается, что кнопка меню используется только для отображения меню, поэтому существует согласованность между приложениями.

...