¿Cómo uso InputFilter para limitar caracteres en un EditText en Android?

Resuelto Tim Wayne asked hace 54 años • 20 respuestas

Quiero restringir los caracteres al 0-9, az, AZ y barra espaciadora únicamente. Al configurar el tipo de entrada, puedo limitarlo a dígitos, pero no puedo entender las formas en que Inputfilter revisa los documentos.

Tim Wayne avatar Jan 01 '70 08:01 Tim Wayne
Aceptado

Encontré esto en otro foro. Funciona como un campeón.

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 });
moonlightcheese avatar Dec 09 '2010 17:12 moonlightcheese

InputFilterLos mensajes son un poco complicados en las versiones de Android que muestran sugerencias de diccionario. A veces obtienes un SpannableStringBuilder, a veces un simple Stringen el sourceparámetro.

Lo siguiente InputFilterdebería funcionar. ¡Siéntete libre de mejorar este código!

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();
        }
    }
}
Łukasz Sromek avatar Sep 29 '2012 20:09 Łukasz Sromek