Android: Wie kann ich die EditText-Eingabe validieren?
Lesezeit: 7 Minuten
Ich muss eine Formulareingabevalidierung für eine Reihe von EditTexts durchführen. Ich verwende OnFocusChangeListeners, um die Validierung auszulösen, nachdem der Benutzer in jeden eingegeben hat, aber dies verhält sich für den letzten EditText nicht wie gewünscht.
Wenn ich auf die Schaltfläche “Fertig” klicke, während ich in den endgültigen EditText tippe, wird die InputMethod getrennt, aber technisch gesehen geht der Fokus nie auf den EditText verloren (und daher findet keine Validierung statt).
Was ist die beste Lösung?
Sollte ich überwachen, wann sich die InputMethod von jedem EditText löst, anstatt wenn sich der Fokus ändert? Wenn das so ist, wie?
Müssen Sie wirklich die EditText-Eingabe validieren, während der Benutzer tippt? Warum validieren Sie nicht einfach die EditTexts, sobald der Benutzer auf die Schaltfläche „Fertig“ klickt?
– Christian
4. Mai 2010 um 6:05 Uhr
Das ist genau das, was ich möchte: dass der Text überprüft wird, wenn der Benutzer auf die Schaltfläche „Fertig“ klickt (mit der Schaltfläche „Fertig“ meine ich die Schaltfläche „Fertig“ im QWERTY InputManager … NICHT die Schaltfläche zum Senden des Formulars). Außer dass, wenn ich auf die Schaltfläche „Fertig“ klicke, der Fokus auf dem letzten Element im Formular bleibt und meine Validierungsmethode nie ausgelöst wird. Hoffe meine Formulierung ist verständlich…
– Stefan
4. Mai 2010 um 21:26 Uhr
Die Lösung von @Cristian ist genau das, wonach ich gesucht habe, und sie ist hier zu finden: stackoverflow.com/questions/43013812/…
– Laternenmast
15. November 2018 um 21:22 Uhr
@Cristian Kommt etwas spät, aber ich suche nach einer Lösung, bei der die EditText’s validiert werden während Die Person tippt. Ich habe ein Anmelde-/Registrierungsformular und möchte die Schaltfläche „Senden“ anzeigen nur wenn die Formulardaten gültig sind.
– Zonker.in.Genf
20. April 2020 um 17:12 Uhr
Niks
Warum benutzt du nicht TextWatcher ?
Da hast du etliche EditText Boxen zu validieren, ich denke, das Folgende wird Ihnen passen:
Ihre Tätigkeit setzt um android.text.TextWatcher Schnittstelle
Sie fügen TextChanged-Listener zu Ihren EditText-Boxen hinzu
Von den überschriebenen Methoden könnten Sie die verwenden afterTextChanged(Editable s) Methode wie folgt
@Override
public void afterTextChanged(Editable s) {
// validation code goes here
}
Die Editable s hilft nicht wirklich herauszufinden, in welchem EditText-Feld der Text geändert wird. Aber Sie könnten den Inhalt der EditText-Boxen wie direkt überprüfen
in der gleichen Methode. Ich hoffe, ich bin klar und wenn ja, hilft es! 🙂
BEARBEITEN: Für einen saubereren Ansatz lesen Sie die Antwort von Christopher Perry unten.
Das sieht nach genau dem aus, was ich brauche. Ich hatte noch nie von TextWatcher gehört (neu im SDK/API), aber ich werde es testen und sehen, ob es sich so verhält, wie ich es mir vorstelle. Danke für die Information!
– Stefan
18. Mai 2010 um 12:30 Uhr
gern geschehen! 🙂 Könnten Sie jetzt, da Sie es validieren, mitteilen, wie Sie den Benutzer über den Validierungsfehler informieren werden? Ich suche derzeit nach den besten Methoden für dasselbe.
– Niks
19. Mai 2010 um 6:57 Uhr
Nikhil Patil, ich benutze Toast nur, um den Benutzer wissen zu lassen, dass er etwas falsch gemacht hat. Gibt es einen Grund, warum das in Ihrem Fall nicht wirksam ist?
– Jewgeni Simkin
18. November 2010 um 21:24 Uhr
Natürlich ist Toast ein natürlicher Weg auf Android. Aber wenn wir eine beträchtliche Anzahl von Elementen auf dem Bildschirm haben, die validiert werden müssen, scheinen Toasts nicht die richtige Wahl zu sein. (IMHO, es würde den Benutzer ärgern) Ich habe mit TextView.setError() (developer.android.com/reference/android/widget/…
– Niks
22. November 2010 um 15:01 Uhr
Obwohl die Unterstützung für TextWatcher schlecht ist, funktioniert es … irgendwie!
– Tivie
22. November 2010 um 17:35 Uhr
Christoph Perry
TextWatcher ist für meinen Geschmack etwas ausführlich, daher habe ich etwas leichter zu schlucken gemacht:
public abstract class TextValidator implements TextWatcher {
private final TextView textView;
public TextValidator(TextView textView) {
this.textView = textView;
}
public abstract void validate(TextView textView, String text);
@Override
final public void afterTextChanged(Editable s) {
String text = textView.getText().toString();
validate(textView, text);
}
@Override
final public void beforeTextChanged(CharSequence s, int start, int count, int after) { /* Don't care */ }
@Override
final public void onTextChanged(CharSequence s, int start, int before, int count) { /* Don't care */ }
}
Verwenden Sie es einfach so:
editText.addTextChangedListener(new TextValidator(editText) {
@Override public void validate(TextView textView, String text) {
/* Validation code here */
}
});
@fremmedehenvendelser : alle EditText IST EIN TextView
– Niks
28. Mai 2014 um 13:25 Uhr
fantastische Abstraktion und Verwendung der abstrakten Klasse
– Saher Ahwal
12. September 2014 um 20:53 Uhr
@fullmeriffic höchstwahrscheinlich hast du deinen EditText nicht initialisiert. Stellen Sie sicher, dass Sie anrufen addTextChangedListener nachdem Sie Ihren Bearbeitungstext aus der Ansicht aufgelöst haben
Wenn Sie schöne Validierungs-Popups und Bilder wünschen, wenn ein Fehler auftritt, können Sie die verwenden setError Methode der EditText Klasse, wie ich es beschreibe Hier
Wie bekommt man einen TextWatcher zum Zugriff zwei Texte bearbeiten? Ich habe meinem TextWatcher erfolgreich hinzugefügt passwordConfirmTextFieldaber ich muss auf den anderen verweisen passwordTextField, damit ich sie vergleichen kann. Irgendwelche Vorschläge?
– Zonker.in.Genf
20. April 2020 um 17:19 Uhr
Um die Ausführlichkeit der Validierungslogik zu reduzieren, habe ich a verfasst Bibliothek für Android. Es erledigt die meisten täglichen Validierungen mithilfe von Anmerkungen und integrierten Regeln. Es gibt Einschränkungen wie z @TextRule, @NumberRule, @Required, @Regex, @Email, @IpAddress, @Passwordetc.,
Sie können diese Anmerkungen zu Ihren UI-Widget-Referenzen hinzufügen und Validierungen durchführen. Es ermöglicht Ihnen auch, Validierungen asynchron durchzuführen, was ideal für Situationen ist, wie z. B. die Überprüfung auf eindeutige Benutzernamen von einem Remote-Server.
Es gibt ein Beispiel auf der Projekthomepage zur Verwendung von Anmerkungen. Sie können auch die lesen zugehörigen Blogbeitrag wo ich Beispielcodes zum Schreiben benutzerdefinierter Regeln für Validierungen geschrieben habe.
Hier ist ein einfaches Beispiel, das die Verwendung der Bibliothek darstellt.
@Required(order = 1)
@Email(order = 2)
private EditText emailEditText;
@Password(order = 3)
@TextRule(order = 4, minLength = 6, message = "Enter at least 6 characters.")
private EditText passwordEditText;
@ConfirmPassword(order = 5)
private EditText confirmPasswordEditText;
@Checked(order = 6, message = "You must agree to the terms.")
private CheckBox iAgreeCheckBox;
Die Bibliothek ist erweiterbar, Sie können Ihre eigenen Regeln schreiben, indem Sie die erweitern Rule Klasse.
Aktualisierter Ansatz – TextInputLayout:
Google hat kürzlich eine Bibliothek zur Designunterstützung gestartet, und es gibt eine Komponente namens TextInputLayout und es unterstützt das Anzeigen eines Fehlers über setErrorEnabled(boolean) und setError(CharSequence).
Wie benutzt man es?
Schritt 1: Umschließen Sie Ihren EditText mit TextInputLayout:
// validating input on a button click
public void btnValidateInputClick(View view) {
final TextInputLayout layoutUserName = (TextInputLayout) findViewById(R.id.layoutUserName);
String strUsername = layoutLastName.getEditText().getText().toString();
if(!TextUtils.isEmpty(strLastName)) {
Snackbar.make(view, strUsername, Snackbar.LENGTH_SHORT).show();
layoutUserName.setErrorEnabled(false);
} else {
layoutUserName.setError("Input required");
layoutUserName.setErrorEnabled(true);
}
}
Ich habe ein Beispiel über meine erstellt Github-Repositorysehen Sie sich das Beispiel an, wenn Sie möchten!
Beste Antwort, aber ich musste verwenden com.google.android.material.textfield.TextInputLayout (man beachte die Material Veränderung). Habe es von dieser Antwort: stackoverflow.com/a/56753953/900394
– Alaa M.
8. Juli 2020 um 19:39 Uhr
Gemeinschaft
Das war eine nette Lösung von hier
InputFilter filter= new InputFilter() {
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
for (int i = start; i < end; i++) {
String checkMe = String.valueOf(source.charAt(i));
Pattern pattern = Pattern.compile("[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456789_]*");
Matcher matcher = pattern.matcher(checkMe);
boolean valid = matcher.matches();
if(!valid){
Log.d("", "invalid");
return "";
}
}
return null;
}
};
edit.setFilters(new InputFilter[]{filter});
Beste Antwort, aber ich musste verwenden com.google.android.material.textfield.TextInputLayout (man beachte die Material Veränderung). Habe es von dieser Antwort: stackoverflow.com/a/56753953/900394
– Alaa M.
8. Juli 2020 um 19:39 Uhr
schneller Junge
Ich habe eine Klasse geschrieben, die EditText erweitert, die einige Validierungsmethoden nativ unterstützt und tatsächlich sehr flexibel ist.
Aktuell, während ich schreibe, nativ durch unterstützt xml-Attribute Validierungsmethoden sind:
Müssen Sie wirklich die EditText-Eingabe validieren, während der Benutzer tippt? Warum validieren Sie nicht einfach die EditTexts, sobald der Benutzer auf die Schaltfläche „Fertig“ klickt?
– Christian
4. Mai 2010 um 6:05 Uhr
Das ist genau das, was ich möchte: dass der Text überprüft wird, wenn der Benutzer auf die Schaltfläche „Fertig“ klickt (mit der Schaltfläche „Fertig“ meine ich die Schaltfläche „Fertig“ im QWERTY InputManager … NICHT die Schaltfläche zum Senden des Formulars). Außer dass, wenn ich auf die Schaltfläche „Fertig“ klicke, der Fokus auf dem letzten Element im Formular bleibt und meine Validierungsmethode nie ausgelöst wird. Hoffe meine Formulierung ist verständlich…
– Stefan
4. Mai 2010 um 21:26 Uhr
Die Lösung von @Cristian ist genau das, wonach ich gesucht habe, und sie ist hier zu finden: stackoverflow.com/questions/43013812/…
– Laternenmast
15. November 2018 um 21:22 Uhr
@Cristian Kommt etwas spät, aber ich suche nach einer Lösung, bei der die EditText’s validiert werden während Die Person tippt. Ich habe ein Anmelde-/Registrierungsformular und möchte die Schaltfläche „Senden“ anzeigen nur wenn die Formulardaten gültig sind.
– Zonker.in.Genf
20. April 2020 um 17:12 Uhr