2010-12-22 9 views
20

Ich habe einen OnKeyListener an einen EditText angehängt. Ich habe den onKey-Handler überschrieben, um ein KeyEvent zu erfassen.Enter-Taste bei EditText zweimaliges Drücken auf OnKey

Wenn ein Benutzer die Eingabetaste drückt (entweder die Eingabetaste des Computers bei Verwendung des Emulators oder die Hardware-Eingabetaste auf dem Telefon mit einer Hardwaretastatur), wird der onKey-Handler zweimal ausgeführt. Beide Ausführungen haben den keyCode 66.

Warum passiert das?

Ich möchte mein Bildschirm so, wenn der Benutzer die Eingabetaste drückt, wird eine Suche durchgeführt. Wegen dem, was passiert, passiert die Suche unnötigerweise zweimal.

Meine Methode sieht wie folgt aus:

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; 
     } 
    }); 

Antwort

23

Ahhhh

Ich denke, das unten nach oben und Schlüssel für Schlüssel geschieht?

+0

Wahrscheinlich. Überprüfen Sie das 'KeyEvent', nicht nur den Code. Ich habe in der Vergangenheit einige Probleme mit der HTC-Tastatur gefunden, die manchmal mehrere Ereignisse auslösen (und manchmal spazieren Benutzer einfach mehrmals auf "Enter"), so dass Sie vielleicht eine Instanzvariable in Ihrem Listener behalten möchten, um nur zu verfolgen, wann Die Aktion wurde ausgelöst, um ein versehentliches zweites Schießen zu verhindern. –

+0

Gute Idee. Ich denke, wenn die Suchaufgabe startet, werde ich eine weitere Aufgabe mit einem Timer von ein paar Sekunden starten und bis dieser Thread beendet ist, wird der Benutzer nicht mehr in der Lage sein, die Eingabetaste zu drücken. – Andrew

+1

Dies sollte nicht als Antwort markiert werden, bitte markieren Sie eine der folgenden (nützlicheren) Antworten als Antwort (ich würde Abdul empfehlen). Vielen Dank. – Stunner

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

das ist für die "Taste gedrückt" und wird generiert, solange der Benutzer es gedrückt hält. – jldupont

11

Versuchen Sie folgendes:

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

Sie wie folgt filtern:

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, wenn Sie den Schlüssel mit KeyEvent.ACTION_DOWN schieben

+0

Overriding es funktionierte für mich. – a54studio

4

Ich hatte das gleiche Problem und die Antworten oben halfen mir, aber ich benutze Xamarin.Android (C#), so ist es etwas andere Syntax .. Hier ist was w orked für mich:

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; 
    } 
} 

diese Weise des DoSomething() nur beim Auftreffen auf Enter-Taste (Up) nur und damit einmal würde gefeuert aufgerufen werden. Funktioniert und getestet auf Xamarin.Android

0

Dieses Ereignis wird von KeyEvent.ACTION_DOWN und KeyEvent.ACTION_UP ausgelöst. Ich habe das Debuggen gemacht und schließlich merke ich, dass es einen Parameter namens KeyEvent event gibt, den ich nie benutze, dann habe ich das Problem überprüft und gefunden.

Verwandte Themen