¿Cómo uso InputFilter para limitar caracteres en un EditText en Android?
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.
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 });
InputFilter
Los mensajes son un poco complicados en las versiones de Android que muestran sugerencias de diccionario. A veces obtienes un SpannableStringBuilder
, a veces un simple String
en el source
parámetro.
Lo siguiente InputFilter
deberí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();
}
}
}