2010-03-19 12 views
14

Quiero hacer una acción personalizada al presionar el botón Menu en el teléfono.Android: ¿Cómo puedo configurar un oyente para MenuButton?

¿Es posible establecer un onClickListener (o similar) en el botón y, de ser así, cómo?

onCreateOptionsMenu solo se llama la primera vez que se presiona el botón - Ya lo he intentado.

Respuesta

30

Por lo general, usted no debe anular MENU comportamiento como 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); 
} 
+1

Gracias - esto es lo que estaba buscando. Y no te preocupes: no voy a cambiar la experiencia del usuario, pero quiero hacer algunas acciones personalizadas antes de que el menú realmente se represente. – Mannaz

+0

yanchenko answert debe ser el aceptado. –

+0

yanchenko tiene una mejor solución. – katzenhut

1

Probablemente puedas hackear algo al usar "OnMenuOpened" o algo así, pero realmente no lo recomendaría. El botón de menú solo se utiliza para mostrar menús, por lo que hay coherencia entre las aplicaciones.

19

Pero se llama onPrepareOptionsMenu(..) cada vez. :)

+1

¡No es una respuesta muy larga, pero esta es la manera de hacerlo! Como dijo, se llama cada vez antes de que aparezca realmente el menú, por lo que puede personalizar su menú en eso. –

+0

debería ser la respuesta aceptada. – katzenhut

+0

¡Parece que para mí no se llama todo el tiempo! la primera o segunda vez se llama pero luego no. es como si Android sabe que ya preparó el menú y está en la memoria por lo que no lo preparará de nuevo. – Mercury

3

actualizada para AppCompat v.22 +

Como mencionado en este forum, KeyDown no se llama al botón KEYCODE_MENU presionado.

la solución es anular dispatchKeyEvent 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).

+2

roto en el appcompat 22.1.xy al menos 22.2.1 ver: https://code.google.com/p/android/issues/detail?id=159795#c20 –

Cuestiones relacionadas