InputFilter ist eine Android SDK-Schnittstelle, die es ermöglicht, eingegebenen Text abzufangen und zu ändern, bevor er in EditText angezeigt wird. Der Entwickler legt Filterregeln fest: erlaubte Zeichen, maximale Länge, Eingabeformat. Laut Android Developers, 2026 wird InputFilter verwendet, um die Eingabe von Buchstaben, Ziffern, Sonderzeichen zu beschränken und Text automatisch zu formatieren. Im Gegensatz zu TextWatcher wird der Filter vor der Textänderung ausgelöst, was fehlerhafte Eingaben auf Quellebene verhindert.
Wichtige Punkte
InputFilter ist eine funktionale Schnittstelle aus dem Paket android.text, die eine einzige Methode filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) definiert. Sie wird jedes Mal automatisch aufgerufen, wenn der Benutzer versucht, Text in EditText einzugeben, einzufügen oder zu ersetzen. Der Rückgabewert bestimmt, ob die Änderung akzeptiert, abgelehnt oder modifiziert wird.
Der Hauptzweck von InputFilter ist die Verhinderung fehlerhafter Eingaben, bevor der Text in das Feld gelangt. Zum Beispiel kann ein Filter in einem Ziffernfeld für Telefonnummern Buchstaben und Sonderzeichen blockieren. In einem Passwortfeld kann er eine Mindestlänge erzwingen. In einem Bestätigungscode-Feld kann er nur Ziffern zulassen. Im Gegensatz zur Validierung über TextWatcher verhindert der Filter, dass fehlerhafte Zeichen überhaupt auf dem Bildschirm erscheinen.
Laut Android Developers wird InputFilter in allen Material Design-Komponenten für TextInputEditText verwendet. Bibliotheken wie PhoneNumberFormattingTextWatcher kombinieren TextWatcher und InputFilter für eine vollständige Formatierung. Es wird empfohlen, InputFilter als erste Schutzbarriere gegen fehlerhafte Eingaben und TextWatcher für die zusätzliche Logik nach der Eingabe zu verwenden.
Die filter-Methode empfängt sechs Parameter: source — der eingegebene Text, start und end — die Grenzen des Eingabefragments, dest — der aktuelle Feldinhalt, dstart und dend — die Einfügeposition. Wenn die Methode null zurückgibt, wird die Änderung unverändert akzeptiert. Wenn sie eine leere Zeichenfolge „“ zurückgibt, wird die Änderung blockiert. Wenn sie eine neue CharSequence zurückgibt, wird der ursprüngliche Text durch den zurückgegebenen Wert ersetzt.
Zum Beispiel: Wenn ein Benutzer versucht, den Buchstaben „a“ in ein Feld einzugeben, das nur Ziffern erlaubt, gibt der Filter „“ zurück, und das Zeichen erscheint nicht. Wenn „123“ eingegeben wird, könnte der Filter „1-2-3“ zurückgeben und Trennzeichen hinzufügen. Dieser Mechanismus ermöglicht die automatische Formatierung von Telefonnummern, Daten und anderen strukturierten Daten ohne TextWatcher.
Wichtig: InputFilter ändert nicht die ursprüngliche Datenquelle, sondern gibt nur eine gefilterte Version zurück. Android selbst wendet den zurückgegebenen Wert auf Editable an. Wenn der Filter null zurückgibt, sind keine zusätzlichen Aktionen erforderlich. Wenn er geänderten Text zurückgibt, entfernt Android den ursprünglichen Bereich und fügt den neuen ein.
Das Android SDK bietet mehrere integrierte Implementierungen von InputFilter. Die gebräuchlichste ist InputFilter.LengthFilter, der die maximale Textlänge begrenzt. Der Konstruktor akzeptiert eine ganze Zahl — die maximale Anzahl von Zeichen. Wenn die aktuelle Textlänge plus Eingabe das Limit überschreitet, gibt der Filter eine gekürzte Zeichenfolge zurück und verhindert so die Überschreitung des Limits.
Ebenfalls verfügbar ist InputFilter.AllCaps, der alle eingegebenen Zeichen in Großbuchstaben umwandelt. Er wird in Feldern für Codes, Postleitzahlen und anderen Daten verwendet, bei denen die Groß-/Kleinschreibung eine Rolle spielt. Der Filter blockiert nicht nur Kleinbuchstaben, sondern wandelt sie um, was für den Benutzer praktisch ist — er sieht das Ergebnis der Umwandlung.
Es gibt InputFilter.LengthFilter für mehrere Limits — durch eine Kombination von Filtern. Wenn Sie beispielsweise die Länge auf 20 Zeichen begrenzen und nur Ziffern zulassen möchten, können Sie LengthFilter + einen benutzerdefinierten Ziffernfilter anwenden. Jeder Filter wird nacheinander ausgeführt, und das Ergebnis des vorherigen wird zum dest für den nächsten.
| Filter | Zweck | Anwendungsbeispiel |
|---|---|---|
| LengthFilter | Textlängenbegrenzung | Namensfeld bis zu 50 Zeichen |
| AllCaps | Umwandlung in Großbuchstaben | Postleitzahlenfeld |
| Benutzerdefinierter InputFilter | Beliebige Filterregeln | Nur Ziffern, keine Sonderzeichen |
Um einen benutzerdefinierten Filter zu erstellen, müssen Sie das InputFilter-Interface implementieren und die filter-Methode überschreiben. Eine häufige Aufgabe ist ein Filter, der nur Ziffern zulässt. In diesem Fall überprüft die Methode jedes Zeichen aus source mit Character.isDigit und gibt eine gefilterte Zeichenfolge oder null zurück, wenn alle Zeichen gültig sind.
class DigitsInputFilter : InputFilter {
override fun filter(
source: CharSequence?,
start: Int,
end: Int,
dest: Spanned?,
dstart: Int,
dend: Int
): CharSequence? {
val sb = StringBuilder()
for (i in start until end) {
val c = source?.get(i)
if (c != null && Character.isDigit(c)) {
sb.append(c)
}
}
return if (sb.length == end - start) null else sb
}
}
Ein Beispiel DigitsInputFilter durchläuft alle Zeichen des eingegebenen Textes und behält nur Ziffern. Wenn alle Zeichen die Prüfung bestehen, gibt die Methode null zurück — dies ist der optimale Fall, da keine zusätzlichen Speicheroperationen erforderlich sind. Wenn einige Zeichen verworfen werden, wird eine neue Zeichenfolge zurückgegeben, und nur Ziffern gelangen in EditText.
Ein weiteres häufiges Szenario ist ein Filter zum Blockieren von Sonderzeichen. Die Implementierung ist ähnlich: Überprüfung jedes Zeichens über Character.isLetterOrDigit oder Vergleich mit einer Liste erlaubter Zeichen. Solche Filter werden in Benutzernamenfeldern, Suchzeichenfolgen und anderen Stellen verwendet, an denen Sonderzeichen nicht erlaubt sind.
Filter werden auf EditText über die Methode setFilters(InputFilter[]) gesetzt. Das Filter-Array ersetzt die aktuellen Filter. Wenn Sie also einen Filter zu vorhandenen Filtern hinzufügen möchten, müssen Sie die aktuellen Filter über getFilters() abrufen, ein neues Array erstellen und es zurücksetzen. EditText hat einen Standardfilter — LengthFilter, der über android:maxLength in XML gesetzt wird.
val editText = findViewById<EditText>(R.id.phone_input)
editText.filters = arrayOf(
DigitsInputFilter(),
InputFilter.LengthFilter(10)
)
Im Beispiel werden zwei Filter gesetzt: DigitsInputFilter (nur Ziffern) und LengthFilter (maximal 10 Zeichen). Die Reihenfolge der Filter im Array ist wichtig: Der erste Filter empfängt die ursprüngliche Eingabe, verarbeitet sie und übergibt das Ergebnis an den zweiten. Wenn DigitsInputFilter einige Zeichen herausfiltert, sieht LengthFilter den bereits gefilterten Text und wendet seine Längenbegrenzung darauf an.
Filter können auch über das XML-Attribut android:inputType gesetzt werden, das automatisch einige Filter hinzufügt. Zum Beispiel fügt inputType=„phone“ DigitsKeyListener hinzu und erlaubt nur Ziffern und einige Sonderzeichen. Für die vollständige Kontrolle über die Filterung wird jedoch empfohlen, setFilters programmgesteuert zu verwenden, insbesondere beim Kombinieren mehrerer Regeln.
InputFilter und TextWatcher erfüllen unterschiedliche Funktionen und werden oft zusammen verwendet. InputFilter arbeitet auf Eingabeebene — er verhindert, dass ungültige Zeichen in das Feld gelangen. TextWatcher arbeitet nach der Eingabe — er ermöglicht es, auf Änderungen zu reagieren, komplexe Validierungsregeln durchzuführen und die Benutzeroberfläche zu aktualisieren. Die Kombination beider Ansätze liefert das beste Ergebnis.
Zum Beispiel für ein E-Mail-Eingabefeld: InputFilter kann Leerzeichen und kyrillische Zeichen auf Eingabeebene blockieren, während TextWatcher nach jeder Änderung die vollständige E-Mail-Musterkonformität überprüfen kann. Ersteres schützt vor offensichtlichen Fehlern, zweiteres vor strukturellen Fehlern. Diese Aufgabentrennung macht den Code sauberer und reduziert die Validierungslast.
Laut den Material Design Guidelines sollten Filter auf Felder mit strengen Einschränkungen angewendet werden: Telefonnummern, Bestätigungscodes, PINs, Postleitzahlen. Für Felder mit weicher Validierung — Name, Adresse, Kommentar — ist TextWatcher allein ausreichend, um Benutzer nicht daran zu hindern, legitime, aber nicht standardgemäße Werte einzugeben.
| Kriterium | InputFilter | TextWatcher |
|---|---|---|
| Auslösezeitpunkt | Vor der Textänderung | Nach der Textänderung |
| Zweck | Blockieren ungültiger Zeichen | Reagieren auf Änderungen, Validierung, UI |
| Rückgabewert | Gefilterter Text oder null | Keiner (void) |
| Anwendung | setFilters() | addTextChangedListener() |
Häufig gestellte Fragen
InputFilter fängt die Eingabe vor der Textänderung ab und kann sie blockieren oder ändern. TextWatcher wird nach der Änderung aufgerufen und ermöglicht es, auf den neuen Wert zu reagieren. InputFilter ist vorbeugender Schutz, TextWatcher ist Nachbearbeitung. Für eine vollständige Formularvalidierung wird empfohlen, beide Ansätze zu verwenden.
Übergeben Sie ein Array von Filtern an die Methode setFilters(). Die Filter werden nacheinander in der Reihenfolge des Arrays ausgeführt. Um vorhandene Filter nicht zu verlieren, rufen Sie sie über getFilters() ab, fügen Sie neue zu einer Kopie des Arrays hinzu und setzen Sie es über setFilters zurück. Überschreiben Sie Filter nicht, ohne bereits installierte zu berücksichtigen.
Ja, InputFilter kann die Eingabe ändern, indem es eine modifizierte CharSequence zurückgibt. Zum Beispiel kann ein Telefonnummernfilter Leerzeichen oder Klammern hinzufügen. Für komplexe Formatierungen ist es jedoch besser, InputFilter mit TextWatcher zu kombinieren, da der Filter auf das Blockieren und nicht auf die Nachbearbeitung ausgerichtet ist.
Beliebige Zeichen: Leerzeichen, Buchstaben, Ziffern, Sonderzeichen, Unicode-Zeichen. In einem benutzerdefinierten Filter definieren Sie die Bedingung mit Character.isLetter, isDigit, isWhitespace oder vergleichen mit einer schwarzen/weißen Liste. Der Filter kann nur lateinische, nur kyrillische oder nur einen bestimmten Zeichensatz zulassen.
Nein, InputFilter wird nur bei Benutzereingabe oder beim Einfügen aus der Zwischenablage ausgelöst. Wenn Text programmatisch über setText() gesetzt wird, werden Filter nicht angewendet. Zur Überprüfung programmatischen Textes verwenden Sie die TextWatcher-Validierung oder explizite Prüfungen vor dem Setzen.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch