2009-10-20 21 views
6

He creado un juego simple de Android, basado en la muestra Lunar Lander, y tengo un problema con el manejo de eventos clave. Cuando se inicia la actividad, las únicas teclas que onKeyDown o onKeyUp reciben son las teclas dpad arriba/abajo/izquierda/derecha. Ni las teclas de menú, atrás ni dpad_center activan métodos onKey. Sin embargo, una vez que he pulsado uno de los botones de dpad arriba/abajo/izquierda/derecha, presionar las teclas de menú, atrás o dpad_center activan estos métodos. No recibo ningún error ni indicio de lo que está pasando mal.onKeyDown no siempre se llama en la aplicación de Android

Es posible que el enfoque esté mal configurado: la actividad se inicia desde un botón en la pantalla, por lo que podría estar en modo de pantalla táctil. Si ese es el caso, ¿no deberías tocar el botón Atrás para que me ponga en el modo de enfoque correcto para poder ver el evento?

Estoy usando el emulador de SDK-1.5r3. Todavía no he podido probar esto en un teléfono real. Aquí está mi onKeyDown.

public boolean onKeyDown(int keyCode, KeyEvent msg) 
{ 
    Log.d(TAG, "onKeyDown: " + keyCode); 
    return super.onKeyDown(keyCode, msg); 
} 

Gracias

Matt

Respuesta

24

Es esta onKeyDown en una vista o en la actividad?

Si setContentView se llama pasar en una vista, y esa vista tiene setFocusable (verdadero) invocado, todos los eventos clave omitirán la actividad e irán directamente a la vista.

Por otro lado, si su onKeyDown está en la vista, y no ha llamado a setContentView en la actividad y setFocusable (verdadero) en la vista, su actividad obtendrá los eventos clave y no la vista.

Busque esas llamadas específicas, pero creo que tiene razón acerca de que se trata de un tema central.

+6

lo fue en la vista - pero mientras que la comprobación de esto, me di cuenta que no tenía setFocusableInTouchMode habilitado - agregando que en solucionado el problema. –

+0

Ah, genial. Lamento haberme perdido el problema real, pero me alegro de haber podido ayudar. – haseman

+1

Intenté esto en un fragmento pero el onKeyDown() de mi vista nunca se llama aunque he establecido su capacidad de enfoque en verdadero: 'searchView.setFocusable (true); searchView.setFocusableInTouchMode (true); '. Sin embargo, se llama a onKeyDown() de la actividad, pero desafortunadamente no para la tecla de retroceso. – faizal

6

Los métodos onKeyDown/onKeyUp de la actividad no siempre se llaman. A diferencia de ellos dispatchKeyEvent on Activity despedido siempre. Mueva la lógica de keydown/keyup aquí. Funciona bien.

@Override 
public boolean dispatchKeyEvent(KeyEvent event) { 
    if (event.getAction() == KeyEvent.ACTION_DOWN) { 
     // keydown logic 
     return true; 
    } 
    return false; 
} 
+1

Gracias por publicar esto. muy útil :) –

Cuestiones relacionadas