InputFilter: qué es, la interfaz InputFilter y el filtrado en Android

Autor: IT Sectr Publicado: 2026-07-08 Tiempo de lectura: 5 min

InputFilter es una interfaz del SDK de Android que permite interceptar y modificar el texto ingresado antes de que se muestre en EditText. El desarrollador define reglas de filtrado: caracteres permitidos, longitud máxima, formato de entrada. Según Android Developers, 2026, InputFilter se utiliza para restringir la entrada de letras, dígitos, caracteres especiales y para formatear texto automáticamente. A diferencia de TextWatcher, el filtro se activa antes de que el texto cambie, evitando la entrada incorrecta a nivel de origen.

Puntos clave

  • InputFilter es una interfaz de Android para restringir y formatear la entrada en EditText y TextView.
  • El método filter se llama antes de cambiar el texto y devuelve una CharSequence filtrada o null si el cambio está permitido.
  • InputFilter.LengthFilter es una implementación estándar para limitar la longitud máxima del texto.
  • Los filtros personalizados permiten prohibir ciertos caracteres, aplicar máscaras de entrada o convertir mayúsculas/minúsculas.
  • Cadena de filtros — se pueden aplicar varios InputFilter a un mismo EditText simultáneamente, y se ejecutan secuencialmente.

¿Qué es InputFilter y para qué sirve?

InputFilter es una interfaz funcional del paquete android.text que define un único método filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend). Se llama automáticamente cada vez que el usuario intenta escribir, pegar o reemplazar texto en EditText. El valor devuelto determina si el cambio será aceptado, rechazado o modificado.

El propósito principal de InputFilter es prevenir la entrada incorrecta antes de que el texto llegue al campo. Por ejemplo, en un campo para dígitos de número telefónico, un filtro puede bloquear letras y caracteres especiales. En un campo de contraseña, puede exigir una longitud mínima. En un campo de código de verificación, puede permitir solo dígitos. A diferencia de la validación mediante TextWatcher, el filtro evita que los caracteres erróneos aparezcan siquiera en pantalla.

Según Android Developers, InputFilter se utiliza en todos los componentes de Material Design para TextInputEditText. Bibliotecas como PhoneNumberFormattingTextWatcher combinan TextWatcher e InputFilter para un formateo completo. Se recomienda usar InputFilter como primera barrera de protección contra entradas incorrectas, y TextWatcher para la lógica adicional posterior a la entrada.

Cómo funciona InputFilter

El método filter recibe seis parámetros: source — el texto de entrada, start y end — los límites del fragmento de entrada, dest — el contenido actual del campo, dstart y dend — la posición de inserción. Si el método devuelve null, el cambio se acepta sin modificaciones. Si devuelve una cadena vacía “”, el cambio se bloquea. Si devuelve una nueva CharSequence, el texto original se reemplaza por el valor devuelto.

Por ejemplo, si un usuario intenta escribir la letra “a” en un campo que solo permite dígitos, el filtro devuelve “” y el carácter no aparece. Si se ingresa “123”, el filtro podría devolver “1-2-3”, añadiendo separadores. Este mecanismo permite formatear automáticamente números de teléfono, fechas y otros datos estructurados sin TextWatcher.

Importante: InputFilter no modifica la fuente de datos original, solo devuelve una versión filtrada. Android mismo aplica el valor devuelto a Editable. Si el filtro devuelve null, no se requieren acciones adicionales. Si devuelve texto modificado, Android elimina el rango original e inserta el nuevo.

Filtros estándar en Android SDK

El SDK de Android proporciona varias implementaciones integradas de InputFilter. La más común es InputFilter.LengthFilter, que limita la longitud máxima del texto. El constructor acepta un número entero — la cantidad máxima de caracteres. Si la longitud del texto actual más la entrada supera el límite, el filtro devuelve una cadena truncada, evitando que se exceda el límite.

También está disponible InputFilter.AllCaps, que convierte todos los caracteres ingresados a mayúsculas. Se utiliza en campos para códigos, códigos postales y otros datos donde las mayúsculas importan. El filtro no solo bloquea las minúsculas, sino que las convierte, lo cual es conveniente para el usuario — ve el resultado de la conversión.

Existe InputFilter.LengthFilter para múltiples límites — mediante una combinación de filtros. Por ejemplo, si necesita limitar la longitud a 20 caracteres y permitir solo dígitos, puede aplicar LengthFilter + un filtro de dígitos personalizado. Cada filtro se ejecuta secuencialmente, y el resultado del anterior se convierte en dest para el siguiente.

FiltroPropósitoEjemplo de uso
LengthFilterRestricción de longitudCampo de nombre hasta 50 caracteres
AllCapsConversión a mayúsculasCampo de código postal
InputFilter personalizadoReglas de filtrado arbitrariasSolo dígitos, sin caracteres especiales

Creación de un InputFilter personalizado

Para crear un filtro personalizado, debe implementar la interfaz InputFilter y sobrescribir el método filter. Una tarea común es un filtro que solo permita dígitos. En este caso, el método verifica cada carácter de source mediante Character.isDigit y devuelve una cadena filtrada o null si todos los caracteres son válidos.

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 ejemplo DigitsInputFilter recorre todos los caracteres del texto ingresado y conserva solo los dígitos. Si todos los caracteres pasan la verificación, el método devuelve null — este es el caso óptimo ya que no requiere operaciones de memoria adicionales. Si se descartan algunos caracteres, se devuelve una nueva cadena y solo los dígitos terminan en EditText.

Otro escenario popular es un filtro para bloquear caracteres especiales. La implementación es similar: verificar cada carácter mediante Character.isLetterOrDigit o comparar con una lista de caracteres permitidos. Dichos filtros se utilizan en campos de nombre de usuario, cadenas de búsqueda y otros lugares donde los caracteres especiales no están permitidos.

Aplicación de InputFilter a EditText

Los filtros se establecen en EditText mediante el método setFilters(InputFilter[]). La matriz de filtros reemplaza los actuales, por lo que si necesita agregar un filtro a los existentes, debe obtener los filtros actuales mediante getFilters(), crear una nueva matriz y volver a establecerla. EditText tiene un filtro predeterminado — LengthFilter, que se establece mediante android:maxLength en XML.

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

En el ejemplo, se establecen dos filtros: DigitsInputFilter (solo dígitos) y LengthFilter (máximo 10 caracteres). El orden de los filtros en la matriz es importante: el primer filtro recibe la entrada original, la procesa y pasa el resultado al segundo. Si DigitsInputFilter filtra algunos caracteres, LengthFilter ve el texto ya filtrado y aplica su restricción de longitud a este.

También se pueden establecer filtros mediante el atributo XML android:inputType, que agrega automáticamente algunos filtros. Por ejemplo, inputType=“phone” agrega DigitsKeyListener y permite solo dígitos y algunos caracteres especiales. Sin embargo, para tener control total sobre el filtrado, se recomienda usar setFilters mediante programación, especialmente al combinar varias reglas.

InputFilter y validación de entrada

InputFilter y TextWatcher cumplen funciones diferentes y a menudo se usan juntos. InputFilter funciona a nivel de entrada — evita que los caracteres incorrectos lleguen al campo. TextWatcher funciona después de la entrada — permite reaccionar a los cambios, realizar validaciones de reglas complejas y actualizar la interfaz de usuario. La combinación de ambos enfoques da el mejor resultado.

Por ejemplo, para un campo de entrada de correo electrónico: InputFilter puede bloquear espacios y caracteres cirílicos a nivel de entrada, mientras que TextWatcher puede verificar el cumplimiento completo del patrón de correo después de cada cambio. El primero protege contra errores obvios, el segundo contra errores estructurales. Esta separación de responsabilidades hace que el código sea más limpio y reduce la carga de validación.

Según las Material Design Guidelines, los filtros deben aplicarse a campos con restricciones estrictas: números de teléfono, códigos de verificación, códigos PIN, códigos postales. Para campos con validación flexible — nombre, dirección, comentario — solo TextWatcher es suficiente para no impedir que los usuarios ingresen valores legítimos pero no estándar.

CriterioInputFilterTextWatcher
Momento de activaciónAntes del cambio de textoDespués del cambio de texto
PropósitoBloquear caracteres no válidosReaccionar a cambios, validación, UI
Valor de retornoTexto filtrado o nullNinguno (void)
AplicaciónsetFilters()addTextChangedListener()

Preguntas frecuentes

¿Cuál es la diferencia entre InputFilter y TextWatcher?

InputFilter intercepta la entrada antes de que el texto cambie y puede bloquearla o modificarla. TextWatcher se llama después del cambio y permite reaccionar al nuevo valor. InputFilter es protección preventiva, TextWatcher es post-procesamiento. Para una validación completa del formulario, se recomienda usar ambos enfoques.

¿Cómo aplicar múltiples filtros a EditText?

Pase una matriz de filtros al método setFilters(). Los filtros se ejecutan secuencialmente en el orden de la matriz. Para no perder los filtros existentes, obténgalos mediante getFilters(), agregue los nuevos a una copia de la matriz y establézcala nuevamente mediante setFilters. No sobrescriba los filtros sin considerar los ya instalados.

¿Se puede usar InputFilter para formatear texto?

Sí, InputFilter puede modificar la entrada devolviendo una CharSequence modificada. Por ejemplo, un filtro para número de teléfono puede agregar espacios o paréntesis. Sin embargo, para formateo complejo, es mejor combinar InputFilter con TextWatcher, ya que el filtro está enfocado en bloquear, no en post-procesamiento.

¿Qué caracteres se pueden bloquear mediante InputFilter?

Cualquier carácter: espacios, letras, dígitos, caracteres especiales, caracteres Unicode. En un filtro personalizado, define la condición usando Character.isLetter, isDigit, isWhitespace o compara con una lista negra/blanca. El filtro puede permitir solo latín, solo cirílico o solo un conjunto específico de caracteres.

¿Funciona InputFilter con cambios de texto programáticos?

No, InputFilter solo se activa con la entrada del usuario o al pegar desde el portapapeles. Si el texto se establece mediante programación con setText(), los filtros no se aplican. Para verificar texto programático, use la validación mediante TextWatcher o comprobaciones explícitas antes de establecerlo.

Resumen

  • InputFilter es una interfaz de Android para filtrar y formatear la entrada a nivel de caracteres antes de mostrarla en EditText.
  • El método filter devuelve null para permitir la entrada, “” para bloquearla, o una nueva CharSequence para modificarla.
  • LengthFilter y AllCaps son filtros estándar de Android SDK para restricción de longitud y conversión de mayúsculas.
  • Los filtros personalizados se crean implementando la interfaz InputFilter con lógica personalizada de verificación de caracteres.
  • Las cadenas de filtros permiten combinar varias reglas que se ejecutan secuencialmente.
  • InputFilter y TextWatcher no entran en conflicto sino que se complementan: el primero bloquea caracteres, el segundo reacciona a los cambios.
  • Los cambios de texto programáticos mediante setText() no pasan por InputFilter — se requiere una validación separada.

Desarrollaremos una aplicación móvil llave en mano

IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.

Discutir el proyecto

Lea también