Android: как настроить прослушиватель MenuButton?

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

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

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


person whlk    schedule 19.03.2010    source источник


Ответы (4)


Обычно вы не должны переопределять поведение 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);
}
person Diego Torres Milano    schedule 19.03.2010
comment
Спасибо - это то, что я искал. И не волнуйтесь — я не собираюсь менять пользовательский интерфейс, но я хочу выполнить некоторые пользовательские действия до того, как меню будет фактически отображено. - person whlk; 22.03.2010
comment
Янченко имеет лучшее решение. - person katzenhut; 22.08.2014

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

person yanchenko    schedule 19.03.2010
comment
Не очень длинный ответ, но это способ сделать это! Как он сказал, он вызывается каждый раз перед тем, как меню действительно появляется, поэтому вы можете настроить свое меню в нем. - person Steve Haley; 19.03.2010
comment
Кажется, что для меня это не называется каждый раз! первый или второй раз звонит, а потом нет. как будто андроид знает, что он уже подготовил меню и находится в памяти, поэтому он не будет готовить его снова. - person Mercury; 04.04.2017

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

person danigonlinea    schedule 29.04.2015
comment
не работает в appcompat 22.1.x и по крайней мере 22.2.1 см.: code.google.com/p/android/issues/detail?id=159795#c20 - person Jon Willis; 31.07.2015

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

person Cheryl Simon    schedule 19.03.2010