InputType es un atributo de Android que determina la naturaleza de los datos de entrada y el comportamiento del teclado para los campos de texto. El valor InputType es una máscara de bits que combina la clase de entrada (texto, número, teléfono, fecha) y modificadores (multilínea, autocorrección, mayúsculas, entrada oculta). InputType afecta el tipo de teclado mostrado, el filtrado de caracteres y el comportamiento del autocompletado. Según Android Developers (2026), InputType es uno de los atributos más importantes para garantizar una entrada de datos correcta y debe establecerse explícitamente para cada campo de texto editable.
Puntos clave
InputType es una constante entera (Int) que codifica el modo de entrada para un campo de texto. En Android, está definida en la clase android.text.InputType. El valor InputType consta de dos partes: la clase de entrada (bits 0–4) y los modificadores (bits 5–31). La clase de entrada define el tipo de dato básico — texto, número, teléfono, fecha. Los modificadores refinan el comportamiento dentro de la clase seleccionada — por ejemplo, para la clase de texto, se puede habilitar la autocorrección, las mayúsculas o la entrada multilínea.
El mecanismo InputType funciona en tres niveles: a nivel del framework de Android, determina qué InputConnection se creará (la conexión entre EditText e IME); a nivel del IME (teclado), especifica qué caracteres mostrar y cómo manejar la entrada; a nivel de la aplicación, filtra los caracteres a través del InputFilter integrado en EditText. Según Android Source Code (AOSP, 2026), la máscara de bits se maneja en el método TextView.getInputType(), que devuelve el valor actual, y setInputType(), que reconfigura los filtros internos y la conexión con el IME.
Una característica importante de InputType es que no se puede leer desde otro proceso por razones de seguridad. Esto evita el robo de datos mediante el acceso al tipo de entrada (por ejemplo, determinar si un campo es una contraseña). Al intentar leer InputType desde otra aplicación, se devuelve TYPE_CLASS_TEXT de forma predeterminada.
// Constantes básicas de InputType
InputType.TYPE_CLASS_TEXT // 0x0001 = 1
InputType.TYPE_CLASS_NUMBER // 0x0002 = 2
InputType.TYPE_CLASS_PHONE // 0x0003 = 3
InputType.TYPE_CLASS_DATETIME // 0x0004 = 4
// Máscara para extraer la clase
InputType.TYPE_MASK_CLASS // 0x0000000F
Android define cuatro clases básicas de InputType. Cada clase corresponde a una categoría específica de datos y activa el tipo de teclado correspondiente. La clase se especifica en los bits 0–4 de la máscara y se puede extraer mediante la máscara TYPE_MASK_CLASS (0x0F).
| Clase | Constante | Teclado | Uso |
|---|---|---|---|
| TEXT | TYPE_CLASS_TEXT (1) | Teclado QWERTY | Texto, comentarios, descripción |
| NUMBER | TYPE_CLASS_NUMBER (2) | Numérico | Cantidad, precio, edad |
| PHONE | TYPE_CLASS_PHONE (3) | Teléfono | Número de teléfono |
| DATETIME | TYPE_CLASS_DATETIME (4) | Fecha/hora | Fecha, hora |
TYPE_CLASS_DATETIME se usa raramente directamente — normalmente para la entrada de fechas se utiliza DatePicker o DatePickerDialog en lugar de un campo de texto. Sin embargo, en algunos escenarios (entrada manual rápida de fecha), esta clase puede ser útil. No tiene un teclado especializado y normalmente muestra un teclado numérico.
Cada clase de entrada se puede combinar con variaciones — subtipos especificados en los bits 5–7. Por ejemplo, TYPE_TEXT_VARIATION_PASSWORD (bit 5) añade entrada oculta a la clase TEXT. Bits de variación: 0x000000E0 (máscara TYPE_MASK_VARIATION).
Las banderas modificadoras de InputType (bits 8–31) añaden capacidades adicionales a la clase base. No cambian el tipo de teclado, pero modifican el comportamiento de entrada. Las banderas son específicas de cada clase — las banderas de TEXT no funcionan con NUMBER, y viceversa. A continuación se muestran los principales modificadores para cada clase.
Según Android Developers Documentation (2026), las banderas de diferentes clases no se superponen — intentar usar una bandera de TEXT con NUMBER será ignorado. Para verificar una bandera establecida, use AND bit a bit: (inputType and FLAG) != 0.
La combinación correcta de clases y banderas de InputType es la clave para crear formularios fáciles de usar. Veamos escenarios típicos y sus configuraciones de InputType correspondientes. Cada escenario optimiza la entrada para un tipo de dato específico, haciendo que el formulario sea intuitivo y acelerando su cumplimentación.
| Escenario | InputType | Teclado |
|---|---|---|
| Nombre | textCapWords | QWERTY, cada palabra con mayúscula |
| textEmailAddress | QWERTY con @ y . | |
| Contraseña | textPassword | QWERTY, entrada oculta |
| Teléfono | phone | Dígitos con +, #, * |
| Precio | numberDecimal | Dígitos con punto decimal |
| Cantidad | number | Solo dígitos |
| Comentario | textCapSentences|textMultiLine | QWERTY, multilínea |
| Búsqueda | text|textNoSuggestions | QWERTY sin sugerencias |
// Combinación para campo de precio
editText.inputType = InputType.TYPE_CLASS_NUMBER or
InputType.TYPE_NUMBER_FLAG_DECIMAL
// Combinación para campo de comentario
editText.inputType = InputType.TYPE_CLASS_TEXT or
InputType.TYPE_TEXT_FLAG_CAP_SENTENCES or
InputType.TYPE_TEXT_FLAG_MULTI_LINE
Establecer InputType programáticamente mediante setInputType() sobrescribe el valor anterior. Si necesita cambiar solo una parte de la máscara (por ejemplo, agregar una bandera), debe guardar el valor actual, modificarlo y aplicarlo de nuevo. Cada llamada a setInputType() reconfigura los filtros internos de EditText.
El método setRawInputType() se diferencia de setInputType en que no provoca la reconfiguración de filtros y sugerencias. Se utiliza para cambiar temporalmente InputType sin una recarga completa del estado de EditText. Después de llamar a setInputType(), se recomienda reiniciar el IME para actualizar el teclado.
// Alternar entre contraseña y texto visible
fun togglePasswordVisibility(editText: EditText) {
val currentType = editText.inputType
val isPassword = (currentType and
InputType.TYPE_TEXT_VARIATION_PASSWORD) != 0
editText.inputType = if (isPassword) {
InputType.TYPE_CLASS_TEXT or
InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
} else {
InputType.TYPE_CLASS_TEXT or
InputType.TYPE_TEXT_VARIATION_PASSWORD
}
// Mantener posición del cursor
val cursorPos = editText.selectionStart
editText.setSelection(cursorPos)
}
// Obtener clase de entrada
fun getInputClass(inputType: Int): Int {
return inputType and InputType.TYPE_MASK_CLASS
}
// Obtener variación de entrada
fun getInputVariation(inputType: Int): Int {
return inputType and InputType.TYPE_MASK_VARIATION
}
// Verificar si es campo de contraseña
fun isPasswordField(editText: EditText): Boolean {
return (editText.inputType and
InputType.TYPE_TEXT_VARIATION_PASSWORD) != 0
}
Elegir el InputType correcto no es solo una cuestión de UX, sino también de seguridad y corrección de datos. Las recomendaciones clave incluyen: especificar siempre un InputType explícito para cada EditText; usar la clase de entrada más específica posible; no combinar banderas de diferentes clases; usar variaciones PASSWORD para campos de datos sensibles; usar imeOptions="actionSearch" para campos de búsqueda.
InputType también afecta el funcionamiento de los servicios de accesibilidad (Accessibility). Los campos con el tipo textPassword reciben protección adicional de los lectores de pantalla — no leen en voz alta los caracteres introducidos. Para los campos textEmailAddress, el lector de pantalla informa al usuario de que el campo está destinado al correo electrónico y proporciona sugerencias adecuadas.
Según Material Design Guidelines (2025), InputType debe coincidir con el tipo de datos que el usuario está introduciendo. Un InputType incorrecto no solo ralentiza la entrada, sino que también puede provocar errores: por ejemplo, si se deja textMultiLine para un campo de número de teléfono, el teclado no mostrará el teclado numérico y el usuario tendrá que cambiar de diseño manualmente cada vez.
Preguntas frecuentes
InputType es un atributo de EditText que define el tipo de datos de entrada mediante una máscara de bits. Keyboard Type es un nombre no oficial para el tipo visual de teclado activado por InputType. InputType también afecta el filtrado de caracteres, la autocorrección y el autocompletado, no solo la disposición del teclado.
Establece editText.inputType = InputType.TYPE_CLASS_TEXT o usa la constante InputType.TYPE_NULL (0x00000000) para un reinicio completo. Con TYPE_NULL, el campo no mostrará el teclado al recibir el foco. Para volver a la entrada de texto estándar, establece TYPE_CLASS_TEXT sin banderas.
No se puede crear una nueva clase InputType, ya que forma parte del framework de Android. Sin embargo, se pueden combinar clases y banderas existentes para lograr el comportamiento deseado. Implementa el filtrado adicional de caracteres a través de InputFilter, que se establece en EditText mediante el método setFilters().
InputType se pasa al sistema de entrada a través de InputConnection. El IME lee la clase y variación de InputType y selecciona la disposición de teclado correspondiente. Por ejemplo, TYPE_CLASS_NUMBER con TYPE_NUMBER_FLAG_DECIMAL hace que el teclado muestre un teclado numérico con punto decimal. La mayoría de los teclados modernos siguen estas recomendaciones.
Usa la propiedad editText.inputType en Kotlin o editText.getInputType() en Java. Para extraer la clase, aplica la máscara: inputType and InputType.TYPE_MASK_CLASS. Para verificar una bandera específica: inputType and InputType.TYPE_TEXT_FLAG_MULTI_LINE — si el resultado != 0, la bandera está establecida.
Resumen
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.
Lea también