Android: ¿Cómo puedo configurar un oyente a la MenuButton?
-
21-09-2019 - |
Pregunta
Quiero hacer una acción personalizada al presionar sobre el botón Menu
en el teléfono.
¿Es posible establecer una OnClickListener (o similar) en el botón y si es así, ¿cómo?
onCreateOptionsMenu
sólo se le llama la primera vez que se pulsa el botón -. Ya he intentado esto
Solución
Por lo general, usted no debe anular el comportamiento MENU
ya que los usuarios esperan que aparezca el menú, sin embargo se puede usar algo como lo siguiente:
/* (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);
}
Otros consejos
Pero onPrepareOptionsMenu(..)
se llama cada vez. :)
Actualización de AppCompat v.22.
Como se ha mencionado en este foro , KeyDown
no se llama para KEYCODE_MENU pulsa el botón.
La solución es anular dispatchKeyEvent
para de esta manera:
@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);
}
Funciona hasta que los desarrolladores de Google lanzan una solución para este (o tal vez no es un error y funciona de esta manera a partir de ahora).
Probablemente se podría cortar algo en el uso de "OnMenuOpened" o algo así, pero realmente no lo recomendaría. El botón del menú se supone sólo para ser utilizado para mostrar los menús, por lo que existe consistencia entre las aplicaciones.