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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top