193 votes

Comment utiliser InputFilter pour limiter les caractères dans un EditText sous Android?

Je veux limiter les caractères à 0-9, az, AZ et à la barre d’espace seulement. Définir le type d'entrée que je peux limiter aux chiffres mais je n'arrive pas à comprendre les manières dont le filtre de saisie regarde les documents.

195voto

moonlightcheese Points 4818

trouvé cela sur un autre forum. travaille comme un champion.

 InputFilter filter = new InputFilter() { 
        public CharSequence filter(CharSequence source, int start, int end, 
Spanned dest, int dstart, int dend) { 
                for (int i = start; i < end; i++) { 
                        if (!Character.isLetterOrDigit(source.charAt(i))) { 
                                return ""; 
                        } 
                } 
                return null; 
        } 
}; 

edit.setFilters(new InputFilter[]{filter}); 
 

149voto

Łukasz Sromek Points 1347

Les InputFilters sont un peu compliqués dans les versions Android qui affichent des suggestions de dictionnaires. Vous obtenez parfois un SpannableStringBuilder, parfois une chaîne simple dans le paramètre source .

Le InputFilter suivant devrait fonctionner. N'hésitez pas à améliorer ce code!

 new InputFilter() {
    @Override
    public CharSequence filter(CharSequence source, int start, int end,
            Spanned dest, int dstart, int dend) {

        if (source instanceof SpannableStringBuilder) {
            SpannableStringBuilder sourceAsSpannableBuilder = (SpannableStringBuilder)source;
            for (int i = end - 1; i >= start; i--) { 
                char currentChar = source.charAt(i);
                 if (!Character.isLetterOrDigit(currentChar) && !Character.isSpaceChar(currentChar)) {    
                     sourceAsSpannableBuilder.delete(i, i+1);
                 }     
            }
            return source;
        } else {
            StringBuilder filteredStringBuilder = new StringBuilder();
            for (int i = start; i < end; i++) { 
                char currentChar = source.charAt(i);
                if (Character.isLetterOrDigit(currentChar) || Character.isSpaceChar(currentChar)) {    
                    filteredStringBuilder.append(currentChar);
                }     
            }
            return filteredStringBuilder.toString();
        }
    }
}
 

109voto

Florian Fröhlich Points 433

beaucoup plus facile:

 <EditText
    android:inputType="text"
    android:digits="0,1,2,3,4,5,6,7,8,9,*,qwertzuiopasdfghjklyxcvbnm" />
 

77voto

Kamil Seweryn Points 231

Aucune des réponses postées ne fonctionnait pour moi. Je suis venu avec ma propre solution:

 InputFilter filter = new InputFilter() {
    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        boolean keepOriginal = true;
        StringBuilder sb = new StringBuilder(end - start);
        for (int i = start; i < end; i++) {
            char c = source.charAt(i);
            if (isCharAllowed(c)) // put your condition here
                sb.append(c);
            else
                keepOriginal = false;
        }
        if (keepOriginal)
            return null;
        else {
            if (source instanceof Spanned) {
                SpannableString sp = new SpannableString(sb);
                TextUtils.copySpansFrom((Spanned) source, start, sb.length(), null, sp, 0);
                return sp;
            } else {
                return sb;
            }           
        }
    }

    private boolean isCharAllowed(char c) {
        return Character.isLetterOrDigit(c) || Character.isSpaceChar(c);
    }
}
editText.setFilters(new InputFilter[] { filter });
 

7voto

mblenton Points 98

En plus de la réponse acceptée, il est également possible d'utiliser par exemple: android:inputType="textCapCharacters" comme attribut de <EditText> afin de n'accepter que les caractères majuscules (et les nombres).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X