onKeyDown no siempre se llama en la app de Android

He creado un sencillo juego para android, basado en el Lunar Lander de la muestra, y estoy teniendo un problema con el manejo de los eventos clave. Cuando se inicie la actividad, la única clave que onKeyDown o onKeyUp obtener son el dpad arriba/abajo/izquierda/derecha teclas. Ni el menú, atrás, o dpad_center claves desencadenan onKey métodos. Sin embargo, una vez que me ha empujado a uno de los dpad arriba/abajo/izquierda/derecha de los botones, pulsando el menú, atrás, o dpad_center teclas activar estos métodos. Yo no estoy de errores, ni ninguna indicación de lo que está mal.

Es posible que se establece el enfoque equivocado de la actividad se inició desde un botón en la pantalla, por lo que podría ser en modo de pantalla táctil. Si ese es el caso, no debe tocar el botón atrás me de a la derecha de modo de enfoque, de modo que puedo capturar el evento?

Estoy usando el emulador del SDK-1.5r3. No he sido capaz de probar esto en un teléfono real, sin embargo. Aquí está mi onKeyDown.

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

Gracias

Matt

OriginalEl autor Matt McMinn | 2009-10-20

2 respuestas

  1. 24

    Es este onKeyDown en una vista o en la actividad?

    Si setContentView se llama el paso de un punto de vista, y que vista tiene setFocusable(true) llamado en él, todos los eventos clave pasará por la actividad e ir directamente a la vista.

    Por otro lado, si su onKeyDown está en la vista, y tú no has llamado a setContentView en la Actividad y setFocusable(true) en la vista, entonces su Actividad se va a obtener la clave de los acontecimientos y no la Vista.

    Buscar esas llamadas, pero creo que tienes razón sobre que es un problema de enfoque.

    Fue en la vista – pero al comprobar esto, me di cuenta de que yo no tenía setFocusableInTouchMode habilitado – y agregó que se ha solucionado el problema.
    Ah, genial. Lo siento, me perdí el problema real, pero me alegro de que podía ayudar.
    He intentado esto en un fragmento, pero el onKeyDown() de mi punto de vista nunca se llama a pesar de que me han puesto es focusability true : searchView.setFocusable(true); searchView.setFocusableInTouchMode(true);. El onKeyDown() de la Actividad no se llama, pero no para la tecla atrás por desgracia.
    creo que el botón atrás se maneja extra en el método ‘onBackPressed’
    onKeyDown no podría ser llamado en respuesta a KeyEvent.KEYCODE_MENUes si usted tiene una barra de herramientas — la implementación de la clase base de dispatchKeyEvent puede decidir que la barra de herramientas controlado el evento, ya que ToolbarActionBar.onMenuKeyEvent siempre devuelve true.

    OriginalEl autor haseman

  2. 8

    Actividad onKeyDown/onKeyUp métodos no siempre se llama. A diferencia de ellos dispatchKeyEvent en la Actividad despedido siempre. Mover keydown/keyup lógica aquí. Funciona bien.

    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_DOWN) {
            //keydown logic
            return true;
        }
        return false;
    }
    Gracias por publicar esto. muy útil 🙂
    En lugar de devolver false, llamada super y devolver el resultado al final.
    No funciona para el Samsung SM-J120F con Android 5.1.1.

    OriginalEl autor yuliskov

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *