2012-06-28 29 views
7

Aquí está mi código:Escuchar la tecla ENTER en el Android

public class CaptureENTER extends Activity implements OnKeyListener{ 

/* on create and other stuff in here*/ 

    @Override 
    public boolean onKey(View v, int keyCode, KeyEvent event) { 
     if ((event.getAction() == KeyEvent.ACTION_DOWN) && 
       (keyCode == KeyEvent.KEYCODE_ENTER)) { 
      Toast.makeText(LiVoiceActivity.this, 
            "YOU CLICKED ENTER KEY", 
            Toast.LENGTH_LONG).show(); 

     }  
     return false; 
    } 

No sé lo que está pasando, pero cuando pulso la tecla ENTER en el teclado (estoy usando el emulador de Android), el evento no está activado.

¿Qué me estoy perdiendo?

Respuesta

10

Prueba esto:

public class CaptureENTER extends Activity implements OnKeyListener{ 

/* on create and other stuff in here*/ 

    @Override 
    public boolean onKey(View v, int keyCode, KeyEvent event) { 
     if ((event.getAction() == KeyEvent.ACTION_DOWN) && 
       (keyCode == KeyEvent.KEYCODE_ENTER)) { 
      Toast.makeText(LiVoiceActivity.this, 
            "YOU CLICKED ENTER KEY", 
            Toast.LENGTH_LONG).show(); 
      return true; 

     }   
     return false; 
    } 

EDIT: David es CORRECTO !!

De vuelta verdadero no es el problema.

Está fallando porque debe configurar al oyente para una Vista, no solo la Actividad.

16

De vuelta true no es el problema.

Está fallando porque debe configurar el oyente en View, no solo en Activity.

editado de aclaración:

El valor de retorno del oyente no está destinado a ser entendido como una señal de que el evento o no se llama. Y de todos modos no podía, ya que la cláusula return solo se llama después de se muestra su Toast.

Es una señal para el sistema de que se necesita más acción (return false) o que el método manejó el evento completamente y correctamente (return true). Es por eso que el documentation dice con estas palabras:

devoluciones

True si el oyente tiene consumió caso, falso en caso contrario.


Hay una diferencia entre:

  • Implementación del View.OnKeyListenerinterface en su clase Activity.

que permite a su Activity para implementar la funcionalidad proporcionada por la interfaz en su clase, es decir, a declaran al mundo que su Activity sabe cómo manejar ese tipo de evento.

Preste atención al hecho de que dije "declare".El hecho de que usted declaró que ya sabe cómo manejar una tarea no significa que la gente va a dar a esa tarea a usted, ni tampoco significa que se puede generar este tipo de tareas por sí mismo. Es una buena metáfora para la palabra clave implements en mi opinión. Aquí el Activity "pide una tarea".

Metáforas a un lado, técnicamente, el Activity está definiendo una forma de manejar ese evento, pero no puede generar ese tipo de evento por sí mismo.

  • establecer las View devoluciones de llamada a su aplicación Activity

Usando eso, un View se une a un oyente (que pasa a ser su Activity), prometiendo notificará cada vez que el evento ocurre.

Se "contrae" con su Activity para recibir una entrada (el usuario presiona la tecla ENTER mientras el View está en foco) y notifica al Activity. Y puesto que el Activity declarado anteriormente que es capaz de realizar que, AMBAS partes pueden ejecutar el contrato según lo acordado previamente (ver punto anterior).

Metáforas aparte de nuevo, técnicamente, aquí la Activity es registrada por el View para ser notificado después, cuando el gatillo View el evento. El Activity declara cómo, pero el View sabe cuando .

Conclusión:

Esto es sólo una metáfora de interface s (al menos en este caso). Puede parecer complicado, pero es muy claro cuando lo piensas como un acuerdo de dos partes. Si necesita una mejor técnica, la explicación, le sugiero leer sobre interface s.


respuesta a la pregunta nueva comentario:

Hola David y todos los demás. ¿Realmente no puedo configurar un oyente para toda la actividad?

no de esa manera. Debe anular dispatchKeyEvent. Un ejemplo:

@Override 
public boolean dispatchKeyEvent(KeyEvent e) { 
if (e.getKeyCode() == KeyEvent.KEYCODE_ENTER) { 
    Toast.makeText(UITestsActivity.this, 
       "YOU CLICKED ENTER KEY", 
       Toast.LENGTH_LONG).show(); 
     return true; 
    } 
    return super.dispatchKeyEvent(e); 
}; 
+0

Ah, y por supuesto debe ser el enfocado ... de lo contrario, ¿cómo diferenciaríamos las Vistas en modo no táctil? Estoy seguro de que está prestando atención a eso , ¿derecho? ¿derecho? ;-) – davidcesarino

+0

1 para la respuesta exacta –

+0

Hola David y todos los demás. ¿Realmente no puedo configurar un oyente para toda la actividad? –

Cuestiones relacionadas