2010-12-22 18 views
20

He adjuntado OnKeyListener a EditText. He anulado el controlador onKey para capturar un KeyEvent.Ingrese la clave en EditText tocando onKey dos veces

Cuando un usuario pulsa la tecla Intro (ya sea que la computadora ingrese la clave mientras usa el emulador o la tecla de ingreso de hardware en su teléfono con un teclado de hardware), el controlador onKey se ejecuta dos veces. Ambas ejecuciones tienen el código clave 66.

¿Por qué sucede esto?

Quiero mi pantalla para que cuando el usuario pulse la tecla Intro, se realice una búsqueda. Debido a lo que está sucediendo, la búsqueda está sucediendo innecesariamente dos veces.

Mi método es el siguiente:

mFilter.setOnKeyListener(new View.OnKeyListener() { 

     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      if (keyCode == KeyEvent.KEYCODE_ENTER) { 
       // perform search 
       return true; 
      } 
      return false; 
     } 
    }); 

Respuesta

23

Ahhhh

Creo que esto está sucediendo para la llave y llave de abajo?

+0

Probablemente. Compruebe el 'KeyEvent', no solo el código. Sin embargo, he encontrado algunos problemas históricamente con el teclado HTC que activan varios eventos (y a veces los usuarios simplemente espacian y presionan "enter" varias veces de todos modos), así que querrás mantener una variable de instancia en tu oyente para rastrear cuando la acción se ha activado para que pueda evitar una segunda descarga accidental. –

+0

Buena idea. Creo que, cuando se inicie la tarea de búsqueda, iniciaré otra tarea con un temporizador de unos segundos y, hasta que termine esa secuencia, el usuario no podrá presionar la tecla Intro nuevamente. – Andrew

+1

Esto no debe marcarse como respuesta, marque una de las siguientes respuestas (más útiles) como respuesta (recomendaría Abdul's). Gracias. – Stunner

16
if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction()==0) { 
+2

que es para la "tecla hacia abajo" y se genera mientras el usuario lo mantenga presionado. – jldupont

11

Prueba esto:

mFilter.setOnKeyListener(new View.OnKeyListener() { 
    public boolean onKey(View v, int keyCode, KeyEvent event) { 
     if (event.getAction() == KeyEvent.ACTION_DOWN) { 
      if (keyCode == KeyEvent.KEYCODE_ENTER) { 
       // perform search 
       return true; 
      } 
     } 
     return false; 
    } 
}); 
6

se puede filtrar la siguiente manera:

object.setOnKeyListener(new OnKeyListener() { 

     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 

      if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_UP) { 
       // do stuff 
       return true; 
      } 

      return false; 
     } 
    }); 

idem cuando se presiona la tecla con KeyEvent.ACTION_DOWN

+0

Sobrescribir funcionó para mí. – a54studio

4

que tenía el mismo problema y las respuestas anteriores me ayudaron, pero estoy usando Xamarin.Android (C#) por lo que es una sintaxis ligeramente diferente. Aquí está lo w orked para mí:

MyStringTextBox.KeyPressed += OnEnterKeyPressed; 

protected void OnEnterKeyPressed(object sender, View.KeyEventArgs e) 
{ 
    if (e.KeyCode == Keycode.Enter && e.Event.Action == KeyEventActions.Up) 
    { 
     DoSomething(this, EventArgs.Empty); 
    } 
    else 
    { 
     e.Handled = false; 
    } 
} 

De esta manera, el HacerAlgo() sólo se llamaría en golpear la tecla Enter (Arriba) solamente y por lo tanto sería despedido una vez. Funciona y ha sido probado en Xamarin.Android

0

Este evento es despedido por KeyEvent.ACTION_DOWN y KeyEvent.ACTION_UP. He depurado y, finalmente, me doy cuenta de que hay un parámetro llamado KeyEvent event que nunca uso, luego verifiqué y encontré el problema.

Cuestiones relacionadas