2012-06-30 15 views
20

Voglio prendere la pressione di qualsiasi tasto della tastiera. Non voglio un EditView o TextView nella mia attività, l'evento deve essere gestito da una vista estesa all'interno della mia attività.Android - Premere il tasto tastiera

Ho appena provato questo:

1) l'override del metodo onKeyUp(int keyCode, KeyEvent event) attività. Questo non funziona con softkeybord ma basta prendere qualche hardkeyboard.

2) Creare il mio OnKeyListener e registrarlo nella mia vista che contiene uno OnTouchListener registrato e funzionante. Questo non funziona affatto con softkeyboar.

3) Ignora il metodo di visualizzazione onKeyUp(int keyCode, KeyEvent event). Questo non funziona affatto se io imposto il mio OnKeyListener né se non lo imposto.

4) Con l'oggetto InputMethodManager Chiamare il metodo showSoftInput e passarlo alla vista. Questo non funziona né per alzare la tastiera, anzi devo chiamare toggleSoftInput; né per cogliere gli eventi chiave.

Ho provato tutto solo nell'emulatore ma penso sia sufficiente. Perché è così complicato prendere un semplice evento chiave da una tastiera?

+0

E quando avete esaminato il codice sorgente per le classi come '' EditText' e TextView', per vedere come gestire, cosa hai imparato? – CommonsWare

+5

Studiare il codice sorgente può aiutare ma richiede troppo tempo. – Bemipefe

risposta

31

Provare a utilizzare dispatchKeyEvent(KeyEvent event) nella tua Activity

@Override 
public boolean dispatchKeyEvent(KeyEvent event) { 
    Log.i("key pressed", String.valueOf(event.getKeyCode())); 
    return super.dispatchKeyEvent(event); 
} 
+0

Funziona! Grazie mille vasart – Bemipefe

+0

Tuttavia ci sono problemi con il personaggio selezionato dal popup che appare in una lunga pressione. Ad esempio, se premo a lungo la 'a' e seleziono 'à' sia getKeyCode che getUnicodeChar restituiscono 0 – Bemipefe

+0

Dai un'occhiata al metodo 'getDeadChar()' nella classe 'KeyEvent' – vasart

13

Con l'accenno di VASART posso ottenere l'evento KeyPress. Per rendere stampabile il codice tasto, ho utilizzato la funzione getUnicodeChar passando lo stato del pulsante meta, quindi solo un cast di caratteri risolve il problema.

Questo è il codice lavoro:

@Override 
public boolean dispatchKeyEvent(KeyEvent KEvent) 
{ 
    int keyaction = KEvent.getAction(); 

    if(keyaction == KeyEvent.ACTION_DOWN) 
    { 
     int keycode = KEvent.getKeyCode(); 
     int keyunicode = KEvent.getUnicodeChar(KEvent.getMetaState()); 
     char character = (char) keyunicode; 

     System.out.println("DEBUG MESSAGE KEY=" + character + " KEYCODE=" + keycode); 
    } 


    return super.dispatchKeyEvent(KEvent); 
} 

Naturalmente questo lavoro solo con i caratteri ASCII.

+0

Nel mio caso, la visualizzazione personalizzata della tastiera non risponde a dispatchkeyEvent .. Ho tastieraView2 implementata e vorrei rilevare una combinazione di tasti come ctrl + c, Ctrl + v in questo modo. Come posso accettarlo – Roster

0

quando la tastiera si apre nell'attività vostra attività diventa in realtà di primo piano ... Tutti TextArea o TextField hanno il loro meccanismo per ottenere keyPressed da tastiera su schermo ... se si desidera utilizzare onKeyDown() listner per tastiera virtuale make sicuro che hai impostato in AndroidManifest File sotto la tua attività android: funzionerà windowSoftInputMode = "stateAlwaysVisible" onkeyDown() ha funzionato per me ...

1

Non ci sono opzioni per gestire eventi di stampa chiave sulla tastiera virtuale (un schermo) solo da una tastiera hardware.

per maggiori dettagli: Handling Keyboard Actions

Problemi correlati