InputFilter är ett Android SDK-gränssnitt som gör att du kan fånga upp och ändra inmatad text innan den visas i EditText. Utvecklaren anger filterregler: tillåtna tecken, maximal längd, inmatningsformat. Enligt Android Developers, 2026 används InputFilter för att begränsa inmatning av bokstäver, siffror, specialtecken och automatisk formatering av text. Till skillnad från TextWatcher fungerar filtret före ändring av text, vilket förhindrar felaktig inmatning på källnivå.
Huvudpunkter
InputFilter är ett funktionellt gränssnitt från paketet android.text som definierar en enda metod filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend). Den anropas automatiskt varje gång användaren försöker skriva in, klistra in eller ersätta text i EditText. Returvärdet avgör om ändringen accepteras, avvisas eller ändras.
Huvudsyftet med InputFilter är att förhindra felaktig inmatning innan texten når fältet. Metoden filter tar emot sex parametrar. Om metoden returnerar null accepteras ändringen utan ändringar. Om en tom sträng “” returneras blockeras ändringen. InputFilter ändrar inte den ursprungliga datakällan, utan returnerar bara den filtrerade versionen.
Till exempel, om användaren försöker mata in bokstaven “a” i ett fält där endast siffror är tillåtna, returnerar filtret “” och tecknet visas inte. InputFilter ändrar inte den ursprungliga datakällan, utan returnerar bara den filtrerade versionen.
Android SDK tillhandahåller flera inbyggda InputFilter-implementeringar. Den vanligaste är InputFilter.LengthFilter som begränsar maximal textlängd. InputFilter.AllCaps omvandlar alla inmatade tecken till versaler.
| Filter | Syfte | Användningsexempel |
|---|---|---|
| LengthFilter | Begränsa textlängd | Namnfält upp till 50 tecken |
| AllCaps | Omvandling till versaler | Postnummerfält |
| Anpassad InputFilter | Godtyckliga filterregler | Endast siffror, specialtecken förbjudna |
För att skapa ett anpassat filter måste du implementera InputFilter-gränssnittet och åsidosätta filtermetoden. DigitsInputFilter-exemplet går igenom alla tecken i den inmatade texten och behåller endast siffror.
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
}
}
Ett annat populärt scenario är ett filter som förbjuder specialtecken, som används i användarnamn, sökning och andra platser där specialtecken inte är tillåtna.
Filter ställs in på EditText via metoden setFilters(InputFilter[]). Filterarrayen ersätter de aktuella filtren. För att lägga till ett filter till befintliga filter måste du hämta de aktuella filtren via getFilters(), skapa en ny array och ställa tillbaka den.
val editText = findViewById<EditText>(R.id.phone_input)
editText.filters = arrayOf(
DigitsInputFilter(),
InputFilter.LengthFilter(10)
)
I exemplet ställs två filter in: DigitsInputFilter (endast siffror) och LengthFilter (maximalt 10 tecken). Filter kan också ställas in via XML-attributet android:inputType.
InputFilter och TextWatcher har olika funktioner och används ofta tillsammans. InputFilter arbetar på inmatningsnivå, TextWatcher arbetar efter inmatning. Kombinationen av båda tillvägagångssätten ger bäst resultat.
| Kriterium | InputFilter | TextWatcher |
|---|---|---|
| Tidpunkt för åtgärd | Före textändring | Efter textändring |
| Syfte | Blockera felaktiga tecken | Reagera på ändringar, validering, UI |
| Returvärde | Filtrerad text eller null | Inget (void) |
| Tillämpning | setFilters() | addTextChangedListener() |
Vanliga frågor
InputFilter fångar upp inmatning före textändring och kan blockera eller ändra den. TextWatcher anropas efter ändring och möjliggör reaktion på det nya värdet.
Skicka en array av filter till metoden setFilters(). Filter körs sekventiellt i arrayens ordning. För att inte förlora befintliga filter, hämta dem via getFilters(), lägg till nya i en kopia av arrayen och ställ tillbaka via setFilters.
Ja, InputFilter kan ändra inmatning genom att returnera en ändrad CharSequence. För komplex formatering är det bättre att kombinera InputFilter med TextWatcher.
Vilka som helst: mellanslag, bokstäver, siffror, specialtecken, Unicode-tecken. Filtret kan endast tillåta latinska, endast kyrilliska eller endast en viss teckenuppsättning.
Nej, InputFilter fungerar endast vid användarinmatning eller inklistring från urklipp. Om text ställs in programmatiskt via setText() tillämpas inte filter. Använd validering via TextWatcher eller explicit kontroll före inställning.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också