2012-03-29 9 views
6

In ascolto di eventi chiave in ActionBarSherlock per visualizzare il menu di overflow sui dispositivi pre-ICS e sto affrontando un problema interessante. Sembrerebbe che non sia in grado di differenziare una semplice pressione di un tasto rispetto a quando l'utente sta premendo a lungo il tasto del menu con l'intenzione di visualizzare l'IME. Entrambi i casi sono KeyEvent esattamente lo stesso e simile a questa:Differenzia Menu normale KeyEvent dall'apertura IME

C'è un modo semplice per distinguere tra questi due eventi distinti?

+0

L'utilizzo del callback 'onPrepareOptionsMenu' è il mio fallback ma preferirei gestirlo tramite eventi chiave. –

risposta

3

Hmmmm ... onLongKeyPress() non sembra funzionare con KEYCODE_MENU. Che noioso.

Questo sembra funzionare sul Nexus S (4.0.3) e Nexus One (2.3.6):

public class MenuKeyDetectorActivity extends Activity { 
    boolean wasLongPress=false; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    } 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_MENU) { 
     wasLongPress=wasLongPress | event.isLongPress(); 
    } 

    return(false); 
    } 

    @Override 
    public boolean onKeyUp(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_MENU) { 
     Log.w("MKD", String.format("wasLongPress: %b", wasLongPress)); 
     wasLongPress=false; 
    } 

    return(false); 
    } 
} 

In sostanza, si noti che si tratti di un premere a lungo o no nei vostri onKeyDown() chiamate, quindi utilizzare tali informazioni in onKeyUp() per determinare la disposizione finale.

+0

Sperando che questa tecnica funzioni con 'onKeyEvent' e rilevando l'azione su/giù. Non vedo perché non lo farebbe. Grazie! –