Android: Как установить слушателя в MenuButton?
Я хочу выполнить индивидуальное действие при нажатии кнопки Menu
на телефоне.
Можно ли установить кнопку onClickListener (или аналогичную) на кнопку, и если да, то как?
onCreateOptionsMenu
вызывается только при первом нажатии кнопки - я уже пробовал это.
Ответы
Ответ 1
Обычно вы не должны переопределять поведение 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);
}
Ответ 2
Но onPrepareOptionsMenu(..)
вызывается каждый раз.:)
Ответ 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 не выпустят исправление для этого (или, может быть, это не ошибка, и теперь он работает так).
Ответ 4
Возможно, вы могли бы что-то взломать при использовании "OnMenuOpened" или некоторых таких, но я бы не рекомендовал его. Кнопка меню предназначена только для отображения меню, поэтому между приложениями существует согласованность.