2010-03-19 11 views
14

Desidero eseguire un'azione personalizzata premendo il tasto Menu sul telefono.Android: come posso impostare un listener sul MenuButton?

È possibile impostare un onClickListener (o simile) sul pulsante e, in caso affermativo, come?

onCreateOptionsMenu viene chiamato solo la prima volta che si preme il pulsante: l'ho già provato.

risposta

30

Di solito non si dovrebbe ignorare MENU comportamento come gli utenti si aspettano di apparire menu, tuttavia è possibile utilizzare qualcosa in queste righe:.

/* (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

Grazie - questo è quello che stavo cercando. E non ti preoccupare - non sto cambiando l'esperienza utente, ma voglio fare alcune azioni personalizzate prima che il menu sia effettivamente renderizzato. – Mannaz

+0

yanchenko rispondere dovrebbe essere accettato. –

+0

yanchenko ha una soluzione migliore. – katzenhut

1

Probabilmente potresti hackerare qualcosa usando "OnMenuOpened" o qualcosa del genere, ma non lo consiglierei davvero. Il pulsante menu dovrebbe essere usato solo per mostrare i menu, quindi c'è coerenza tra le applicazioni.

19

Ma onPrepareOptionsMenu(..) viene chiamato ogni volta. :)

+1

Non una risposta molto lunga, ma questo è il modo per farlo! Come ha detto, viene chiamato ogni volta prima che il menu venga effettivamente visualizzato, in modo da poter personalizzare il menu in questo. –

+0

dovrebbe essere la risposta accettata. – katzenhut

+0

Sembra che per me non è chiamato ogni volta! la prima o la seconda volta si chiama ma poi no. è come se Android sapesse già preparato il menu e il suo in memoria, quindi non lo preparerà di nuovo. – Mercury

3

Aggiornato per AppCompat V.22 +

Come menzionato in questo forum, KeyDown non viene chiamato per il pulsante KEYCODE_MENU premuto.

La soluzione è quella di ignorare dispatchKeyEvent a questo modo:

@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); 
} 

Funziona fino a quando gli sviluppatori di Google rilasciare una correzione per questo (o forse non è un bug e funziona in questo modo da ora in poi).

+2

interrotto in appcompat 22.1.xe almeno 22.2.1 vedere: https://code.google.com/p/android/issues/detail?id=159795#c20 –

Problemi correlati