InputFilter : qu'est-ce que c'est, l'interface InputFilter et le filtrage sous Android

Auteur : IT Sectr Publié le : 2026-07-08 Temps de lecture : 5 min

InputFilter est une interface du SDK Android qui permet d'intercepter et de modifier le texte saisi avant son affichage dans EditText. Le développeur définit des règles de filtrage : caractères autorisés, longueur maximale, format de saisie. Selon Android Developers, 2026, InputFilter est utilisé pour restreindre la saisie de lettres, chiffres, caractères spéciaux et pour formater automatiquement le texte. Contrairement à TextWatcher, le filtre se déclenche avant la modification du texte, empêchant ainsi les saisies incorrectes au niveau de la source.

Points essentiels

  • InputFilter est une interface Android pour restreindre et formater la saisie dans EditText et TextView.
  • La méthode filter est appelée avant la modification du texte et retourne une CharSequence filtrée ou null si la modification est autorisée.
  • InputFilter.LengthFilter est une implémentation standard pour limiter la longueur maximale du texte.
  • Les filtres personnalisés permettent d'interdire certains caractères, d'appliquer un masque de saisie ou de convertir la casse des lettres.
  • Chaîne de filtres — plusieurs InputFilter peuvent être appliqués à un seul EditText simultanément, et ils s'exécutent séquentiellement.

Qu'est-ce qu'InputFilter et pourquoi en a-t-on besoin ?

InputFilter est une interface fonctionnelle du package android.text qui définit une seule méthode filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend). Elle est appelée automatiquement chaque fois que l'utilisateur tente de saisir, coller ou remplacer du texte dans EditText. La valeur de retour détermine si la modification sera acceptée, rejetée ou modifiée.

Le but principal d'InputFilter est de prévenir les saisies incorrectes avant que le texte n'entre dans le champ. Par exemple, dans un champ de chiffres de numéro de téléphone, un filtre peut bloquer les lettres et les caractères spéciaux. Dans un champ de mot de passe, il peut imposer une longueur minimale. Dans un champ de code de vérification, il peut n'autoriser que les chiffres. Contrairement à la validation via TextWatcher, le filtre empêche les caractères erronés d'apparaître à l'écran.

Selon Android Developers, InputFilter est utilisé dans tous les composants Material Design pour TextInputEditText. Des bibliothèques comme PhoneNumberFormattingTextWatcher combinent TextWatcher et InputFilter pour un formatage complet. Il est recommandé d'utiliser InputFilter comme première barrière de protection contre les saisies incorrectes, et TextWatcher pour la logique supplémentaire après la saisie.

Comment fonctionne InputFilter

La méthode filter reçoit six paramètres : source — le texte saisi, start et end — les limites du fragment saisi, dest — le contenu actuel du champ, dstart et dend — la position d'insertion. Si la méthode retourne null, la modification est acceptée sans changement. Si elle retourne une chaîne vide «», la modification est bloquée. Si elle retourne une nouvelle CharSequence, le texte original est remplacé par la valeur retournée.

Par exemple, si un utilisateur tente de saisir la lettre «a» dans un champ qui n'accepte que les chiffres, le filtre retourne «» et le caractère n'apparaît pas. Si «123» est saisi, le filtre peut retourner «1-2-3» en ajoutant des séparateurs. Ce mécanisme permet un formatage automatique des numéros de téléphone, des dates et d'autres données structurées sans TextWatcher.

Important : InputFilter ne modifie pas la source de données originale, il retourne uniquement une version filtrée. Android lui-même applique la valeur retournée à Editable. Si le filtre retourne null, aucune action supplémentaire n'est nécessaire. S'il retourne un texte modifié, Android supprime la plage d'origine et insère la nouvelle.

Filtres standard dans le SDK Android

Le SDK Android fournit plusieurs implémentations intégrées d'InputFilter. La plus courante est InputFilter.LengthFilter, qui limite la longueur maximale du texte. Le constructeur accepte un entier — le nombre maximal de caractères. Si la longueur actuelle du texte plus la saisie dépasse la limite, le filtre retourne une chaîne tronquée, empêchant le dépassement de la limite.

Également disponible, InputFilter.AllCaps convertit tous les caractères saisis en majuscules. Il est utilisé dans les champs pour les codes, les codes postaux et autres données où la casse est importante. Le filtre ne se contente pas de bloquer les minuscules, il les convertit, ce qui est pratique pour l'utilisateur — il voit le résultat de la conversion.

Il existe InputFilter.LengthFilter pour plusieurs limites — via une combinaison de filtres. Par exemple, si vous devez limiter la longueur à 20 caractères et n'autoriser que les chiffres, vous pouvez appliquer LengthFilter + un filtre de chiffres personnalisé. Chaque filtre s'exécute séquentiellement et le résultat du précédent devient le dest pour le suivant.

FiltreObjectifExemple d'utilisation
LengthFilterLimitation de longueurChamp nom jusqu'à 50 caractères
AllCapsConversion en majusculesChamp code postal
InputFilter personnaliséRègles de filtrage arbitrairesChiffres uniquement, caractères spéciaux interdits

Création d'un InputFilter personnalisé

Pour créer un filtre personnalisé, vous devez implémenter l'interface InputFilter et redéfinir la méthode filter. Une tâche courante est un filtre qui n'autorise que les chiffres. Dans ce cas, la méthode vérifie chaque caractère du source via Character.isDigit et retourne une chaîne filtrée ou null si tous les caractères sont valides.

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 exemple DigitsInputFilter parcourt tous les caractères du texte saisi et ne conserve que les chiffres. Si tous les caractères réussissent le test, la méthode retourne null — c'est le cas optimal car il ne nécessite pas d'opérations mémoire supplémentaires. Si certains caractères sont rejetés, une nouvelle chaîne est retournée et seuls les chiffres arrivent dans EditText.

Un autre scénario courant est un filtre pour bloquer les caractères spéciaux. L'implémentation est similaire : vérification de chaque caractère via Character.isLetterOrDigit ou comparaison avec une liste de caractères autorisés. Ces filtres sont utilisés dans les champs de nom d'utilisateur, les chaînes de recherche et autres endroits où les caractères spéciaux ne sont pas autorisés.

Application d'InputFilter à EditText

Les filtres sont définis sur EditText via la méthode setFilters(InputFilter[]). Le tableau de filtres remplace les filtres actuels. Si vous devez ajouter un filtre aux filtres existants, vous devez récupérer les filtres actuels via getFilters(), créer un nouveau tableau et le redéfinir. EditText a un filtre par défaut — LengthFilter, qui est défini via android:maxLength dans le XML.

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

Dans l'exemple, deux filtres sont définis : DigitsInputFilter (chiffres uniquement) et LengthFilter (maximum 10 caractères). L'ordre des filtres dans le tableau est important : le premier filtre reçoit la saisie originale, la traite et transmet le résultat au second. Si DigitsInputFilter filtre certains caractères, LengthFilter voit le texte déjà filtré et applique sa limite de longueur à celui-ci.

Les filtres peuvent également être définis via l'attribut XML android:inputType, qui ajoute automatiquement certains filtres. Par exemple, inputType=«phone» ajoute DigitsKeyListener et n'autorise que les chiffres et certains caractères spéciaux. Cependant, pour un contrôle total du filtrage, il est recommandé d'utiliser setFilters par programmation, surtout lors de la combinaison de plusieurs règles.

InputFilter et validation de saisie

InputFilter et TextWatcher remplissent des fonctions différentes et sont souvent utilisés ensemble. InputFilter agit au niveau de la saisie — il empêche les caractères invalides d'entrer dans le champ. TextWatcher agit après la saisie — il permet de réagir aux modifications, d'effectuer une validation de règles complexes et de mettre à jour l'interface utilisateur. La combinaison des deux approches donne le meilleur résultat.

Par exemple, pour un champ de saisie d'e-mail : InputFilter peut bloquer les espaces et les caractères cyrilliques au niveau de la saisie, tandis que TextWatcher peut vérifier la conformité complète au modèle d'e-mail après chaque modification. Le premier protège contre les erreurs évidentes, le second contre les erreurs structurelles. Cette séparation des responsabilités rend le code plus propre et réduit la charge de validation.

Selon les Material Design Guidelines, les filtres doivent être appliqués aux champs avec des contraintes strictes : numéros de téléphone, codes de vérification, codes PIN, codes postaux. Pour les champs avec validation souple — nom, adresse, commentaire — seul TextWatcher suffit pour ne pas empêcher les utilisateurs de saisir des valeurs légitimes mais non standard.

CritèreInputFilterTextWatcher
Moment de déclenchementAvant la modification du texteAprès la modification du texte
ObjectifBloquer les caractères invalidesRéagir aux changements, validation, UI
Valeur de retourTexte filtré ou nullAucune (void)
ApplicationsetFilters()addTextChangedListener()

Questions fréquentes

Quelle est la différence entre InputFilter et TextWatcher ?

InputFilter intercepte la saisie avant la modification du texte et peut la bloquer ou la modifier. TextWatcher est appelé après la modification et permet de réagir à la nouvelle valeur. InputFilter est une protection préventive, TextWatcher est un post-traitement. Pour une validation complète du formulaire, il est recommandé d'utiliser les deux approches.

Comment appliquer plusieurs filtres à EditText ?

Passez un tableau de filtres à la méthode setFilters(). Les filtres s'exécutent séquentiellement dans l'ordre du tableau. Pour ne pas perdre les filtres existants, récupérez-les via getFilters(), ajoutez-en de nouveaux à une copie du tableau et redéfinissez-le via setFilters. Ne remplacez pas les filtres sans tenir compte de ceux déjà installés.

Peut-on utiliser InputFilter pour formater du texte ?

Oui, InputFilter peut modifier la saisie en retournant une CharSequence modifiée. Par exemple, un filtre pour numéro de téléphone peut ajouter des espaces ou des parenthèses. Cependant, pour un formatage complexe, il est préférable de combiner InputFilter avec TextWatcher, car le filtre est axé sur le blocage plutôt que sur le post-traitement.

Quels caractères peuvent être bloqués via InputFilter ?

Tous les caractères : espaces, lettres, chiffres, caractères spéciaux, caractères Unicode. Dans un filtre personnalisé, vous définissez la condition en utilisant Character.isLetter, isDigit, isWhitespace ou en comparant avec une liste noire/blanche. Le filtre peut n'autoriser que le latin, que le cyrillique ou qu'un ensemble spécifique de caractères.

InputFilter fonctionne-t-il avec les modifications programmatiques de texte ?

Non, InputFilter ne se déclenche que lors de la saisie utilisateur ou du collage depuis le presse-papiers. Si le texte est défini par programmation via setText(), les filtres ne sont pas appliqués. Pour vérifier le texte programmatique, utilisez la validation via TextWatcher ou des vérifications explicites avant la définition.

Résumé

  • InputFilter est une interface Android pour filtrer et formater la saisie au niveau des caractères avant leur affichage dans EditText.
  • La méthode filter retourne null pour autoriser la saisie, «» pour la bloquer, ou une nouvelle CharSequence pour la modifier.
  • LengthFilter et AllCaps sont des filtres standard du SDK Android pour la limitation de longueur et la conversion de casse.
  • Les filtres personnalisés sont créés en implémentant l'interface InputFilter avec une logique de vérification de caractères personnalisée.
  • Les chaînes de filtres permettent de combiner plusieurs règles qui s'exécutent séquentiellement.
  • InputFilter et TextWatcher ne sont pas en conflit mais se complètent : l'un bloque les caractères, l'autre réagit aux changements.
  • Les modifications programmatiques de texte via setText() ne passent pas par InputFilter — une validation séparée est nécessaire.

Nous développerons une application mobile clé en main

IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.

Discuter du projet

Lisez aussi