2012-06-30 22 views
20

Quiero ver presionar cualquier tecla del teclado. No quiero un EditView o TextView en mi Actividad, el evento debe ser manejado desde una Vista extendida dentro de mi Actividad.Android - Obtener la tecla del teclado presione

Acabo de intentar esto:

1) reemplazar el método onKeyUp(int keyCode, KeyEvent event) actividad. Esto no funciona con softkeybord solo captura pocos hardkeyboard.

2) Crear mi OnKeyListener y registrar eso en mi Vista que contiene un OnTouchListener registrado y que funciona. Esto no funciona en absoluto con softkeyboar.

3) Anula el método de vista onKeyUp(int keyCode, KeyEvent event). Esto no funciona para nada si configuro mi OnKeyListener ni si no lo configuro.

4) Con el objeto InputMethodManager Llame al método showSoftInput y páselo a mi Vista. Esto no funciona ni para levantar el teclado, de hecho tengo que llamar al toggleSoftInput; ni para atrapar los eventos clave.

Probé todo solo en el emulador, pero creo que es suficiente. ¿Por qué es tan complicado tomar un simple evento clave de un teclado?

+0

Y cuando usted examinó el código fuente para clases como '' EditText' y TextView', para ver cómo lo manejan, ¿qué aprendió? – CommonsWare

+5

Estudiar el código fuente puede ayudar, pero tomar demasiado tiempo. – Bemipefe

Respuesta

31

Intente utilizar dispatchKeyEvent(KeyEvent event) en su Activity

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

¡Funciona! Muchas gracias vasart – Bemipefe

+0

Sin embargo, hay un problema con el personaje seleccionado por la ventana emergente que aparece en la pulsación larga. Por ejemplo, si presiono durante mucho tiempo la 'a' y selecciono 'à', tanto getKeyCode como getUnicodeChar return 0 – Bemipefe

+0

Eche un vistazo al método 'getDeadChar()' en la clase 'KeyEvent' – vasart

13

Con el toque de VASART yo puede conseguir el evento KeyPress. Para hacer que el código de clave se pueda imprimir, he usado la función getUnicodeChar pasándole el estado del botón meta y luego solo un molde fundido resuelve el problema.

Este es el código trabajo:

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

Por supuesto este trabajo únicamente con caracteres ASCII.

+0

En mi caso, la vista del teclado personalizado no responde a dispatchkeyEvent .. Implementé keyboardView y me gustaría detectar una combinación de teclas como ctrl + c, Ctrl + v así. ¿Cómo puedo lograr eso? – Roster

0

Cuando se abre el teclado en la actividad de la actividad de su realidad se convierte en primer plano ... Todo TextArea o campos de texto tienen su propio mecanismo para conseguir keypressed del teclado en pantalla ... si desea utilizar onKeyDown() para listner virtual de maquillaje teclado Asegúrese de configurar el archivo AndroidManifest en su actividad android: windowSoftInputMode = "stateAlwaysVisible" y luego onkeyDown() funcionará. Me funcionó ...

1

No hay opción para manejar eventos de pulsación de teclas en el teclado virtual (un -sistema de pantalla) solo desde un teclado de hardware.

para más detalles: Handling Keyboard Actions

Cuestiones relacionadas