2012-07-01 12 views
9

Quiero iniciar una actividad cuando el usuario presiona la barra espaciadora. Mi código no detecta cuando se hace clic en la barra espaciadora.Actividad de inicio cuando se pulsa una tecla

@Override 
public boolean dispatchKeyEvent(KeyEvent e) { 
    if (e.getKeyCode() == KeyEvent.KEYCODE_SPACE) { 
     Toast.makeText(MainActivity.this, "YOU CLICKED SPACE KEY", 
       Toast.LENGTH_LONG).show(); 
     return true; 
    } 
    Toast.makeText(MainActivity.this, "Didnt work", Toast.LENGTH_SHORT) 
      .show(); 
    return super.dispatchKeyEvent(e); 
}; 

}

Respuesta

8

Es posible ajustar bien al oyente a un Viewque tiene actual enfoque, o utilizar dispatchKeyEvent en su Activity, como se ve in this answer.

Ambos funcionarán.


respuesta a sus comentarios: Si has seguido mi enlace, de lo que has implementado Activity.dispatchKeyEvent(KeyEvent) por ahora. :-)

El código duerma registrarse con cualquier tecla presiono, pero cuando presiono la parte posterior clave se tuesta para mí "no funcionó"

hace suceder que estar usando el emulador? Lo pregunto porque el último SDK parece tener algunos problemas con el teclado del emulador. Las teclas especiales (DPAD, HOME, BACK, etc.) funcionan, pero el teclado QWERTY en pantalla no registra ninguna imprenta. El teclado físico de mi computadora portátil tampoco registrará ninguna imprenta.

No me preguntes por qué.

Y digo eso porque esta semana publiqué la respuesta en el enlace, y funcionó bien. El cambio es que actualicé el SDK de Android a R20/JB esta mañana, así que supongo que podría ser un factor.

Sin embargo, será sólo el trabajo en un dispositivo verdadera. Acabo de conectar un teclado físico a mi tableta (P7510/Honeycomb 3.2) y que escucha perfectamente las prensas de espacio.

En caso de que todavía está dudando, aquí está la prueba: :-)

enter image description here

+0

Así que sí, o no has configurado ese oyente en una Vista, o la Vista para la que configuras el oyente no está enfocada cuando presionas la barra espaciadora. – davidcesarino

+0

He editado mi código usando dispatchkeyevent. Voy a intentarlo de otra manera, pero mientras tanto se publica mi código actualizado. –

+0

Entonces, ¿funcionó? ¿No aparece el Toast cuando presiona la tecla ENTER? – davidcesarino

1

Para este caso, lo que he hecho es, he utilizado la función reemplazada 'OnKey'

@Override 
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) 
{ 
    if (keyCode == nNeededKeyCode) 
    { 
     //do something 
    } 
    return true; 
} 

ps en primer lugar, necesita hacer uso de 'OnKeyListener()' para obtener el evento de presionar la tecla

1

Disculpe la respuesta copiar/pegar, pero esto debería lograr lo que está intentando.

Esto tendrá lugar cuando el usuario presiona la "barra espaciadora" y luego deja ir la barra espaciadora. Si no quiere esperar a que lo dejen ir, puede eliminar mis valores booleanos y ejecutar su código en la función onKeyDown. Espero que esto ayude.

boolean spacePressed = false; 
@Override 
public boolean onKeyDown(View arg0, Editable arg1, int arg2, KeyEvent arg3) { 
    // TODO Auto-generated method stub 
     switch (keyCode) { 
       case KeyEvent.KEYCODE_SPACE: 
       { 
        spacePressed = true; 
        return true; 
       } 
       // other cases can go here 
    } 

    return true; 
}// End of onKeyDown 



@Override 
public boolean onKeyUp(View arg0, Editable arg1, int arg2, KeyEvent arg3) { 
    if (spacePressed){ 
     // start intent 

     // make this false again, so other keys won't trigger it 
     spacePressed = false; 
    } 

    return true; 
}// End of onKeyUp 
2
public abstract boolean onKey (View v, int keyCode, KeyEvent event) 

Esta función se puede utilizar para verificar que la tecla que se pulsa.

Cuestiones relacionadas