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

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

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

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

Solutions Collecting From Web of "Android: Как установить слушателя в MenuButton?"

Обычно вы не должны переопределять поведение 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); } 

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

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

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