InputFilter je rozhraní Android SDK, které umožňuje zachytit a upravovat zadávaný text před jeho zobrazením v EditText. Vývojář nastavuje pravidla filtrování: povolené znaky, maximální délku, formát vstupu. Podle Android Developers, 2026 se InputFilter používá pro omezení zadávání písmen, číslic, speciálních znaků a automatické formátování textu. Na rozdíl od TextWatcher, filtr funguje před změnou textu, což zabraňuje nesprávnému vstupu na úrovni zdroje.
Hlavní body
InputFilter je funkční rozhraní z balíčku android.text, které definuje jedinou metodu filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend). Je voláno automaticky pokaždé, když se uživatel pokusí zadat, vložit nebo nahradit text v EditText. Návratová hodnota určuje, zda bude změna přijata, odmítnuta nebo upravena.
Hlavním účelem InputFilter je zabránění nesprávnému vstupu před tím, než se text dostane do pole. Metoda filter přijímá šest parametrů. Pokud metoda vrátí null, změna je přijata beze změn. Pokud vrátí prázdný řetězec „“, změna je blokována. InputFilter nemění původní zdroj dat, pouze vrací filtrovanou verzi.
Například, pokud se uživatel pokusí vložit písmeno „a“ do pole, kde jsou povoleny pouze číslice, filtr vrátí „“ a znak se neobjeví. InputFilter nemění původní zdroj dat, pouze vrací filtrovanou verzi.
Android SDK poskytuje několik vestavěných implementací InputFilter. Nejrozšířenější je InputFilter.LengthFilter, který omezuje maximální délku textu. InputFilter.AllCaps převádí všechny zadávané znaky na velká písmena.
| Filtr | Účel | Příklad použití |
|---|---|---|
| LengthFilter | Omezení délky textu | Pole jména do 50 znaků |
| AllCaps | Převod na velká písmena | Pole PSČ |
| Vlastní InputFilter | Libovolná pravidla filtrování | Pouze číslice, speciální znaky zakázány |
Pro vytvoření vlastního filtru je třeba implementovat rozhraní InputFilter a přepsat metodu filter. Příklad filtru DigitsInputFilter prochází všechny znaky zadávaného textu a ponechává pouze číslice.
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
}
}
Dalším oblíbeným scénářem je filtr zakazující speciální znaky, používaný v polích uživatelského jména, vyhledávání a dalších místech, kde speciální znaky nejsou povoleny.
Filtry se nastavují na EditText pomocí metody setFilters(InputFilter[]). Pole filtrů nahrazuje aktuální filtry. Pro přidání filtru k existujícím je třeba získat aktuální filtry přes getFilters(), vytvořit nové pole a nastavit jej zpět.
val editText = findViewById<EditText>(R.id.phone_input)
editText.filters = arrayOf(
DigitsInputFilter(),
InputFilter.LengthFilter(10)
)
V příkladu jsou nastaveny dva filtry: DigitsInputFilter (pouze číslice) a LengthFilter (maximálně 10 znaků). Filtry lze také nastavit pomocí XML atributu android:inputType.
InputFilter a TextWatcher mají různé funkce a často se používají společně. InputFilter pracuje na úrovni vstupu, TextWatcher pracuje po vstupu. Kombinace obou přístupů dává nejlepší výsledek.
| Kritérium | InputFilter | TextWatcher |
|---|---|---|
| Okamžik činnosti | Před změnou textu | Po změně textu |
| Účel | Blokování nesprávných znaků | Reakce na změny, validace, UI |
| Návratová hodnota | Filtrovaný text nebo null | Žádná (void) |
| Aplikace | setFilters() | addTextChangedListener() |
Často kladené otázky
InputFilter zachycuje vstup před změnou textu a může jej blokovat nebo měnit. TextWatcher se volá po změně a umožňuje reagovat na novou hodnotu.
Předejte pole filtrů metodě setFilters(). Filtry se provádějí sekvenčně v pořadí pole. Abyste neztratili stávající filtry, získejte je přes getFilters(), přidejte nové do kopie pole a nastavte zpět přes setFilters.
Ano, InputFilter může upravovat vstup vrácením upraveného CharSequence. Pro komplexní formátování je lepší kombinovat InputFilter s TextWatcher.
Jakékoli: mezery, písmena, číslice, speciální znaky, Unicode znaky. Filtr může povolit pouze latinku, pouze cyrilici nebo pouze určitou sadu znaků.
Ne, InputFilter funguje pouze při zadávání uživatelem nebo vkládání ze schránky. Pokud je text nastaven programově pomocí setText(), filtry se nepoužijí. Použijte validaci přes TextWatcher nebo explicitní kontrolu před nastavením.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také