InputFilter: cos'è, l'interfaccia InputFilter e il filtraggio in Android

Autore: IT Sectr Pubblicato: 2026-07-08 Tempo di lettura: 5 min

InputFilter è un'interfaccia dell'SDK Android che consente di intercettare e modificare il testo inserito prima che venga visualizzato in EditText. Lo sviluppatore imposta regole di filtraggio: caratteri consentiti, lunghezza massima, formato di input. Secondo Android Developers, 2026, InputFilter viene utilizzato per limitare l'inserimento di lettere, cifre, caratteri speciali e per formattare automaticamente il testo. A differenza di TextWatcher, il filtro si attiva prima della modifica del testo, impedendo input errati a livello di origine.

Punti chiave

  • InputFilter è un'interfaccia Android per limitare e formattare l'input in EditText e TextView.
  • Il metodo filter viene chiamato prima della modifica del testo e restituisce una CharSequence filtrata o null se la modifica è consentita.
  • InputFilter.LengthFilter è un'implementazione standard per limitare la lunghezza massima del testo.
  • Filtri personalizzati consentono di proibire determinati caratteri, applicare una maschera di input o convertire maiuscole/minuscole.
  • Catena di filtri — più InputFilter possono essere applicati a un singolo EditText contemporaneamente e vengono eseguiti in sequenza.

Cos'è InputFilter e a cosa serve?

InputFilter è un'interfaccia funzionale del pacchetto android.text che definisce un unico metodo filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend). Viene chiamato automaticamente ogni volta che l'utente tenta di digitare, incollare o sostituire testo in EditText. Il valore restituito determina se la modifica sarà accettata, respinta o modificata.

Lo scopo principale di InputFilter è prevenire input errati prima che il testo entri nel campo. Ad esempio, in un campo per le cifre del numero di telefono, un filtro può bloccare lettere e caratteri speciali. In un campo password, può imporre una lunghezza minima. In un campo codice di verifica, può consentire solo cifre. A differenza della validazione tramite TextWatcher, il filtro impedisce ai caratteri errati di apparire sullo schermo.

Secondo Android Developers, InputFilter è utilizzato in tutti i componenti Material Design per TextInputEditText. Librerie come PhoneNumberFormattingTextWatcher combinano TextWatcher e InputFilter per una formattazione completa. Si consiglia di utilizzare InputFilter come prima barriera di protezione contro input errati e TextWatcher per la logica aggiuntiva post-input.

Come funziona InputFilter

Il metodo filter riceve sei parametri: source — il testo inserito, start e end — i limiti del frammento di input, dest — il contenuto attuale del campo, dstart e dend — la posizione di inserimento. Se il metodo restituisce null, la modifica viene accettata senza modifiche. Se restituisce una stringa vuota “”, la modifica viene bloccata. Se restituisce una nuova CharSequence, il testo originale viene sostituito con il valore restituito.

Ad esempio, se un utente tenta di digitare la lettera “a” in un campo che consente solo cifre, il filtro restituisce “” e il carattere non appare. Se viene inserito “123”, il filtro potrebbe restituire “1-2-3”, aggiungendo separatori. Questo meccanismo consente la formattazione automatica di numeri di telefono, date e altri dati strutturati senza TextWatcher.

Importante: InputFilter non modifica la fonte dati originale, restituisce solo una versione filtrata. Android stesso applica il valore restituito a Editable. Se il filtro restituisce null, non sono necessarie azioni aggiuntive. Se restituisce testo modificato, Android rimuove l'intervallo originale e inserisce quello nuovo.

Filtri standard nell'SDK Android

L'SDK Android fornisce diverse implementazioni integrate di InputFilter. La più comune è InputFilter.LengthFilter, che limita la lunghezza massima del testo. Il costruttore accetta un numero intero — il numero massimo di caratteri. Se la lunghezza attuale del testo più l'input supera il limite, il filtro restituisce una stringa troncata, impedendo il superamento del limite.

Disponibile anche InputFilter.AllCaps, che converte tutti i caratteri inseriti in maiuscolo. Viene utilizzato nei campi per codici, codici postali e altri dati dove maiuscole/minuscole sono importanti. Il filtro non si limita a bloccare le minuscole, ma le converte, il che è comodo per l'utente — vede il risultato della conversione.

Esiste InputFilter.LengthFilter per più limiti — attraverso una combinazione di filtri. Ad esempio, se è necessario limitare la lunghezza a 20 caratteri e consentire solo cifre, è possibile applicare LengthFilter + un filtro cifre personalizzato. Ogni filtro viene eseguito in sequenza e il risultato del precedente diventa il dest per il successivo.

FiltroScopoEsempio di utilizzo
LengthFilterLimitazione lunghezza testoCampo nome fino a 50 caratteri
AllCapsConversione in maiuscoloCampo codice postale
InputFilter personalizzatoRegole di filtraggio arbitrarieSolo cifre, caratteri speciali vietati

Creazione di un InputFilter personalizzato

Per creare un filtro personalizzato, è necessario implementare l'interfaccia InputFilter e sovrascrivere il metodo filter. Un compito comune è un filtro che consente solo cifre. In questo caso, il metodo controlla ogni carattere di source tramite Character.isDigit e restituisce una stringa filtrata o null se tutti i caratteri sono validi.

kotlin
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
    }
}

Un esempio DigitsInputFilter scorre tutti i caratteri del testo inserito e mantiene solo le cifre. Se tutti i caratteri superano il controllo, il metodo restituisce null — questo è il caso ottimale poiché non richiede operazioni di memoria aggiuntive. Se alcuni caratteri vengono scartati, viene restituita una nuova stringa e solo le cifre arrivano in EditText.

Un altro scenario comune è un filtro per bloccare i caratteri speciali. L'implementazione è simile: controllare ogni carattere tramite Character.isLetterOrDigit o confrontare con un elenco di caratteri consentiti. Tali filtri sono utilizzati nei campi nome utente, stringhe di ricerca e altri luoghi dove i caratteri speciali non sono consentiti.

Applicazione di InputFilter a EditText

I filtri vengono impostati su EditText tramite il metodo setFilters(InputFilter[]). L'array di filtri sostituisce quelli correnti, quindi se è necessario aggiungere un filtro a quelli esistenti, è necessario ottenere i filtri correnti tramite getFilters(), creare un nuovo array e reimpostarlo. EditText ha un filtro predefinito — LengthFilter, che viene impostato tramite android:maxLength in XML.

kotlin
val editText = findViewById<EditText>(R.id.phone_input)
editText.filters = arrayOf(
    DigitsInputFilter(),
    InputFilter.LengthFilter(10)
)

Nell'esempio, vengono impostati due filtri: DigitsInputFilter (solo cifre) e LengthFilter (massimo 10 caratteri). L'ordine dei filtri nell'array è importante: il primo filtro riceve l'input originale, lo elabora e passa il risultato al secondo. Se DigitsInputFilter filtra alcuni caratteri, LengthFilter vede il testo già filtrato e applica la sua limitazione di lunghezza su di esso.

I filtri possono anche essere impostati tramite l'attributo XML android:inputType, che aggiunge automaticamente alcuni filtri. Ad esempio, inputType=“phone” aggiunge DigitsKeyListener e consente solo cifre e alcuni caratteri speciali. Tuttavia, per il controllo completo del filtraggio, si consiglia di utilizzare setFilters a livello di codice, specialmente quando si combinano più regole.

InputFilter e validazione dell'input

InputFilter e TextWatcher svolgono funzioni diverse e vengono spesso utilizzati insieme. InputFilter agisce a livello di input — impedisce ai caratteri non validi di entrare nel campo. TextWatcher agisce dopo l'input — consente di reagire alle modifiche, eseguire validazioni di regole complesse e aggiornare l'interfaccia utente. La combinazione di entrambi gli approcci offre il miglior risultato.

Ad esempio, per un campo di input email: InputFilter può bloccare spazi e caratteri cirillici a livello di input, mentre TextWatcher può verificare la piena conformità al modello email dopo ogni modifica. Il primo protegge dagli errori evidenti, il secondo dagli errori strutturali. Questa separazione delle responsabilità rende il codice più pulito e riduce il carico di validazione.

Secondo le Material Design Guidelines, i filtri dovrebbero essere applicati ai campi con vincoli rigidi: numeri di telefono, codici di verifica, PIN, codici postali. Per i campi con validazione flessibile — nome, indirizzo, commento — solo TextWatcher è sufficiente per non impedire agli utenti di inserire valori legittimi ma non standard.

CriterioInputFilterTextWatcher
Momento di attivazionePrima della modifica del testoDopo la modifica del testo
ScopoBloccare caratteri non validiReagire a modifiche, validazione, UI
Valore restituitoTesto filtrato o nullNessuno (void)
ApplicazionesetFilters()addTextChangedListener()

Domande frequenti

Qual è la differenza tra InputFilter e TextWatcher?

InputFilter intercetta l'input prima della modifica del testo e può bloccarlo o modificarlo. TextWatcher viene chiamato dopo la modifica e consente di reagire al nuovo valore. InputFilter è protezione preventiva, TextWatcher è post-elaborazione. Per una validazione completa del modulo, si consiglia di utilizzare entrambi gli approcci.

Come applicare più filtri a EditText?

Passa un array di filtri al metodo setFilters(). I filtri vengono eseguiti in sequenza nell'ordine dell'array. Per non perdere i filtri esistenti, recuperali tramite getFilters(), aggiungine di nuovi a una copia dell'array e reimpostalo tramite setFilters. Non sovrascrivere i filtri senza considerare quelli già installati.

Si può usare InputFilter per formattare il testo?

Sì, InputFilter può modificare l'input restituendo una CharSequence modificata. Ad esempio, un filtro per il numero di telefono può aggiungere spazi o parentesi. Tuttavia, per formattazioni complesse, è meglio combinare InputFilter con TextWatcher, poiché il filtro è focalizzato sul blocco piuttosto che sulla post-elaborazione.

Quali caratteri possono essere bloccati tramite InputFilter?

Qualsiasi carattere: spazi, lettere, cifre, caratteri speciali, caratteri Unicode. In un filtro personalizzato, definisci la condizione usando Character.isLetter, isDigit, isWhitespace o confrontando con una lista nera/bianca. Il filtro può consentire solo latino, solo cirillico o solo un insieme specifico di caratteri.

InputFilter funziona con modifiche programmatiche del testo?

No, InputFilter si attiva solo con l'input dell'utente o con l'incolla dagli appunti. Se il testo viene impostato a livello di codice tramite setText(), i filtri non vengono applicati. Per verificare il testo programmatico, utilizza la validazione tramite TextWatcher o controlli espliciti prima dell'impostazione.

Riepilogo

  • InputFilter è un'interfaccia Android per filtrare e formattare l'input a livello di caratteri prima della visualizzazione in EditText.
  • Il metodo filter restituisce null per consentire l'input, “” per bloccarlo o una nuova CharSequence per modificarlo.
  • LengthFilter e AllCaps sono filtri standard dell'SDK Android per la limitazione della lunghezza e la conversione di maiuscole/minuscole.
  • Filtri personalizzati vengono creati implementando l'interfaccia InputFilter con logica personalizzata di controllo dei caratteri.
  • Catene di filtri consentono di combinare più regole che vengono eseguite in sequenza.
  • InputFilter e TextWatcher non sono in conflitto ma si completano a vicenda: il primo blocca i caratteri, il secondo reagisce alle modifiche.
  • Le modifiche programmatiche del testo tramite setText() non passano attraverso InputFilter — è necessaria una validazione separata.

Svilupperemo un'applicazione mobile chiavi in mano

IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.

Discuti il progetto

Leggi anche