InputFilter este o interfață Android SDK care permite interceptarea și modificarea textului introdus înainte de afișarea acestuia în EditText. Dezvoltatorul stabilește regulile de filtrare: caractere permise, lungime maximă, format de introducere. Conform Android Developers, 2026, InputFilter este utilizat pentru limitarea introducerii literelor, cifrelor, caracterelor speciale și formatarea automată a textului. Spre deosebire de TextWatcher, filtrul acționează înainte de modificarea textului, prevenind introducerea incorectă la nivelul sursei.
Principalele
InputFilter este o interfață funcțională din pachetul android.text care definește o singură metodă filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend). Este apelată automat de fiecare dată când utilizatorul încearcă să introducă, să insereze sau să înlocuiască text în EditText. Valoarea returnată determină dacă modificarea va fi acceptată, respinsă sau modificată.
Scopul principal al InputFilter este prevenirea introducerii incorecte înainte ca textul să ajungă în câmp. De exemplu, în câmpul pentru introducerea cifrelor numărului de telefon, filtrul poate interzice literele și caracterele speciale. În câmpul parolei — să limiteze lungimea minimă. În câmpul codului de confirmare — să permită doar cifrele.
Metoda filter primește șase parametri: source — textul introdus, start și end — limitele fragmentului introdus, dest — conținutul curent al câmpului, dstart și dend — poziția unde este inserat textul. Dacă metoda returnează null, modificarea este acceptată fără schimbări. Dacă returnează un șir gol „“, modificarea este blocată. Dacă returnează un nou CharSequence, textul original este înlocuit cu cel returnat.
Important: InputFilter nu modifică sursa originală de date, ci doar returnează versiunea filtrată. Android aplică singur valoarea returnată la Editable. Dacă filtrul returnează null, nu sunt necesare acțiuni suplimentare. Dacă returnează text modificat, Android șterge intervalul original și inserează unul nou.
Metoda filter primește șase parametri. Dacă returnează null, modificarea este acceptată. Dacă returnează un șir gol „“, modificarea este blocată. Dacă returnează un nou CharSequence, textul original este înlocuit.
De exemplu, dacă utilizatorul încearcă să insereze litera „a“ într-un câmp unde sunt permise doar cifrele, filtrul returnează „“, iar caracterul nu apare. Dacă inserează „123“, filtrul poate returna „1-2-3“, adăugând separatori. Acest mecanism permite implementarea formatării automate a numărului de telefon, datei și altor date structurate fără participarea TextWatcher.
InputFilter nu modifică sursa originală de date, ci doar returnează versiunea filtrată. Android aplică singur valoarea returnată la Editable.
Android SDK oferă mai multe implementări încorporate ale InputFilter. Cel mai răspândit este InputFilter.LengthFilter, care limitează lungimea maximă a textului. InputFilter.AllCaps transformă toate caracterele introduse în majuscule.
| Filtru | Scop | Exemplu de utilizare |
|---|---|---|
| LengthFilter | Limitarea lungimii textului | Câmp nume până la 50 de caractere |
| AllCaps | Transformare în majuscule | Câmp cod poștal |
| InputFilter personalizat | Reguli de filtrare arbitrare | Doar cifre, caractere speciale interzise |
Pentru a crea un filtru personalizat, trebuie să implementați interfața InputFilter și să suprascrieți metoda filter. O sarcină frecventă este un filtru care permite doar cifrele.
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
}
}
Exemplul filtrului DigitsInputFilter parcurge toate caracterele textului introdus și păstrează doar cifrele. Un alt scenariu popular este filtrul care interzice caracterele speciale, utilizat în câmpurile de nume de utilizator, căutare și alte locuri unde caracterele speciale nu sunt permise.
Filtrele se setează pe EditText prin metoda setFilters(InputFilter[]). Tabloul de filtre înlocuiește filtrele curente.
val editText = findViewById<EditText>(R.id.phone_input)
editText.filters = arrayOf(
DigitsInputFilter(),
InputFilter.LengthFilter(10)
)
În exemplu, se setează două filtre: DigitsInputFilter (doar cifre) și LengthFilter (maximum 10 caractere). Filtrele pot fi setate și prin atributul XML android:inputType.
InputFilter și TextWatcher au funcții diferite și sunt adesea utilizate împreună. InputFilter acționează la nivelul introducerii — nu permite caracterelor incorecte să ajungă în câmp. TextWatcher acționează după introducere — permite reacția la modificări, validarea regulilor complexe și actualizarea UI.
| Criteriu | InputFilter | TextWatcher |
|---|---|---|
| Moment de acțiune | Înainte de modificarea textului | După modificarea textului |
| Scop | Blocarea caracterelor incorecte | Reacție la modificări, validare, UI |
| Valoare returnată | Text filtrat sau null | Nu (void) |
| Aplicare | setFilters() | addTextChangedListener() |
Înntrebări frecvente
InputFilter interceptează introducerea înainte de modificarea textului și poate bloca sau modifica aceasta. TextWatcher este apelat după modificare și permite reacția la noua valoare. InputFilter — protecție preventivă, TextWatcher — post-procesare. Pentru validarea completă a formularului, se recomandă utilizarea ambelor abordări.
Transmiteți un tablou de filtre la metoda setFilters(). Filtrele se execută secvențial în ordinea tabloului. Pentru a nu pierde filtrele existente, obțineți-le prin getFilters(), adăugați-le pe cele noi într-o copie a tabloului și setați-le înapoi prin setFilters.
Da, InputFilter poate modifica introducerea, returnând un CharSequence modificat. De exemplu, filtrul pentru numărul de telefon poate adăuga spații sau paranteze. Totuși, pentru formatarea complexă, este mai bine să combinați InputFilter cu TextWatcher.
Orice: spații, litere, cifre, caractere speciale, caractere Unicode. Filtrul poate permite doar latină, doar chirilică sau doar un anumit set de caractere.
Nu, InputFilter acționează doar la introducerea de către utilizator sau la inserarea din clipboard. Dacă textul este setat programatic prin setText(), filtrele nu se aplică. Pentru verificarea textului programatic, utilizați validarea prin TextWatcher sau verificarea explicită înainte de setare.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și