2012-03-25 8 views
2

während meiner Debug-Sitzungen fand ich eine seltsame Sache vorkommende. Ich habe ein EditText Steuerelement, für das ich die aktuelle Aktivität als OnKeyListener definiert, um die Validierung während der Benutzertypen durchzuführen.OnKey-Ereignis zweimal ausgelöst, wenn ich Text in ein Textfeld eintippe. Wie man etwas vorbeugt?

-Code

txtPhoneNumber.setOnEditorActionListener(this); 
txtPhoneNumber.setOnKeyListener(this); 
txtPhoneNumber.setOnFocusChangeListener(this); 

@Override 
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
    String phoneNumber = ((TextView) v).getText().toString(); 
    if (phoneNumber != null && !"".equals(phoneNumber)) 
     setValidPhoneNumber(checkValidPhoneNumber(phoneNumber)); 

    setForwardButtonEnabled(this.validPhoneNumber && this.readyToGo); 

    if (actionId == EditorInfo.IME_ACTION_DONE) { 
     InputMethodManager in = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
     in.hideSoftInputFromWindow(v.getApplicationWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); 
    } 

    return false; 
} 

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

    String phoneNumber = ((TextView) v).getText().toString(); 
    if (phoneNumber != null && !"".equals(phoneNumber)) 
     setValidPhoneNumber(checkValidPhoneNumber(phoneNumber)); 

    setForwardButtonEnabled(this.validPhoneNumber && this.readyToGo); 

    return false; 
} 

OK Ich kann zugeben, dass dies ziemlich überflüssig ist die Validierung erneut auszuführen, wenn der Benutzer die Enter-Taste drückt, mehr als nur die Soft-Tastatur schließen. Ich habe jedoch festgestellt, dass das OnKey-Ereignis zweimal ausgelöst wird.

Zum Beispiel schreibe ich 3551234567 und ich tippte bereits 355. Wenn ich 1 drücke, wird ein Ereignis ausgelöst mit v.getText() = 355 und als nächstes ein anderes Ereignis hat v.getText() = 3551 = 3551.

Ich würde gerne wissen, ob das normal ist und wenn dies vermieden werden kann, indem Sie unterscheiden, ob dies ein "preOnKeyEvent" oder "postOnKeyEvent" ist. Ich brauche nur die Zeichenfolge nach das Ereignis, nicht vor.

Vielen Dank

Antwort

5

Sie bekommen wahrscheinlich beide die Taste herunter/Taste hoch Ereignisse.

Versuchen Sie, Ihre Methode zu filtern, indem Sie die Aktion des KeyEvent für eine Aktion ACTION_UP überprüfen.

lesen this für weitere Informationen

+0

Ich bin nicht sicher, wie vielleicht -------------- event.getAction() == KeyEvent. ACTION_UP? –

+0

Das ist genau wie :) –

2

Sie erhalten das Ereignis für Taste gedrückt und Taste nach oben. Es ist besser für Text Änderungsereignis zu hören statt Schlüsselereignis

txtPhoneNumber.addTextChangedListener(new TextWatcher() { 

    public void onTextChanged(CharSequence s, ....){ 
     //validation 
    } 
}); 
Verwandte Themen