Keyboard Type es una configuración del teclado virtual en Android que define el conjunto de caracteres mostrados y la disposición para un campo de entrada específico. Android admite muchos tipos preestablecidos: text (texto estándar), number (numérico), phone (telefónico), email (con símbolo @), textPassword (para contraseñas), datetime y otros. Cada tipo optimiza la interfaz de entrada para una tarea específica — por ejemplo, el teclado de email muestra el símbolo @ y el punto en la pantalla principal. Según Android Developers (2026), elegir el Keyboard Type correcto reduce el número de pulsaciones en un 20–40% en comparación con un teclado de texto estándar.
Puntos Clave
Keyboard Type se determina por el valor del atributo android:inputType en XML o mediante una llamada programática a setInputType() en código. InputType es una máscara de bits donde la clase de entrada se combina con banderas modificadoras. Las clases base son: TYPE_CLASS_TEXT para texto, TYPE_CLASS_NUMBER para números, TYPE_CLASS_PHONE para teléfonos, TYPE_CLASS_DATETIME para fechas y horas.
Cada Keyboard Type afecta tres aspectos: la disposición del teclado virtual (qué caracteres son visibles en la pantalla principal), el filtrado de caracteres ingresados (qué caracteres están permitidos) y el comportamiento de autocorrección/autocompletado. Por ejemplo, el teclado numérico muestra solo dígitos y el separador decimal, y no muestra letras incluso si el usuario cambia de mayúsculas. Según Android Developers Documentation (2026), combinar clases con banderas permite crear modos altamente especializados: texto multilínea con autocorrección, número de punto flotante, contraseña con soporte de autocompletado.
Es importante entender que Keyboard Type es una recomendación para el sistema de entrada (IME). Algunos teclados de terceros (Gboard, SwiftKey) pueden ignorar parcialmente el tipo especificado si el usuario ha configurado sus propias preferencias. Sin embargo, la mayoría de los teclados estándar de Android y Google Gboard siguen estrictamente el tipo de entrada especificado.
// Configuración programática del tipo de teclado
editText.inputType = InputType.TYPE_CLASS_NUMBER or
InputType.TYPE_NUMBER_FLAG_DECIMAL or
InputType.TYPE_NUMBER_FLAG_SIGNED
TYPE_CLASS_TEXT es la clase base para la entrada de texto. Activa el teclado QWERTY estándar con letras, dígitos y símbolos. La clase de texto tiene la mayor cantidad de modificadores que refinan el comportamiento: TYPE_TEXT_FLAG_CAP_SENTENCES (letra mayúscula automática al inicio de una oración), TYPE_TEXT_FLAG_AUTO_CORRECT (autocorrección), TYPE_TEXT_FLAG_MULTI_LINE (modo multilínea), TYPE_TEXT_FLAG_NO_SUGGESTIONS (desactivar sugerencias).
Los modificadores del teclado de texto se pueden combinar para crear configuraciones precisas: por ejemplo, text|textCapSentences|textAutoCorrect es adecuado para un campo de entrada de comentarios donde se necesita mayúscula automática y corrección de errores tipográficos. Mientras tanto, text|textNoSuggestions se usa para ingresar código o términos especiales donde la autocorrección puede ser perjudicial.
Según UX Stack Exchange (2025), un teclado de texto con autocorrección activada acelera la escritura en un 15–25% para el usuario promedio, pero para términos técnicos (código, URL, email) se recomienda desactivar la autocorrección, ya que a menudo reemplaza términos correctos por incorrectos.
<!-- Text with autocorrect and capital sentences -->
android:inputType="textCapSentences|textAutoCorrect"
<!-- Text without suggestions and autocorrect -->
android:inputType="textNoSuggestions"
TYPE_CLASS_NUMBER activa el teclado numérico, que muestra solo dígitos, el separador decimal y el signo menos. Este tipo se usa para campos de entrada de cantidad, precios, edad, códigos y otros datos numéricos. El teclado numérico ocupa menos espacio en pantalla que un teclado de texto y elimina la entrada accidental de letras.
Number tiene tres modificadores: TYPE_NUMBER_FLAG_DECIMAL añade un punto/como decimal, TYPE_NUMBER_FLAG_SIGNED añade un signo menos para números negativos, TYPE_NUMBER_VARIATION_PASSWORD — para códigos PIN donde los dígitos se muestran como caracteres ocultos. La combinación number|numberDecimal|numberSigned crea un campo completo para ingresar números de punto flotante de cualquier signo.
// Entrada numérica con punto decimal
editText.inputType = InputType.TYPE_CLASS_NUMBER or
InputType.TYPE_NUMBER_FLAG_DECIMAL
// Verificar número ingresado
val amount = editText.text.toString().toDoubleOrNull() ?: 0.0
TYPE_CLASS_PHONE activa el teclado telefónico, que muestra dígitos y caracteres típicos de números de teléfono: +, #, *, (, ). A diferencia del teclado numérico, phone también muestra una disposición de letras en un modo adicional, ya que los números de teléfono pueden contener letras (por ejemplo, 1-800-FLOWERS). La clase phone no tiene banderas adicionales pero admite TYPE_TEXT_VARIATION_PHONE_ETC para ingresar extensiones.
TYPE_TEXT_VARIATION_EMAIL_ADDRESS activa el teclado de email, donde el símbolo @ y el punto están en la pantalla principal, y también están disponibles las extensiones de dominio comunes (.com, .net, .org). Gboard adicionalmente muestra botones con dominios populares al escribir después de @. El teclado de email desactiva automáticamente la autocorrección ya que las direcciones de email pueden contener combinaciones de caracteres no estándar.
Según Google Material Design Guidelines (2025), para campos de teléfono se recomienda adicionalmente especificar el atributo android:digits, que limita el conjunto de caracteres permitidos. Para campos de email, también es importante especificar autofillHints="email" para admitir el autocompletado de gestores de contraseñas y Google Autofill.
<!-- Email keyboard with autofill -->
android:inputType="textEmailAddress"
android:importantForAutofill="yes"
android:autofillHints="emailAddress"
<!-- Phone keyboard with digit restriction -->
android:inputType="phone"
android:digits="0123456789+"
TYPE_TEXT_VARIATION_PASSWORD y TYPE_NUMBER_VARIATION_PASSWORD son modos de entrada para datos sensibles. Cuando se establece textPassword, los caracteres ingresados se muestran como puntos o asteriscos (dependiendo de la versión de Android y el teclado). El teclado en este modo desactiva la autocorrección y el guardado de palabras ingresadas en el diccionario del usuario, evitando la fuga de contraseñas a través de funciones de entrada predictiva.
El teclado Password también desactiva la capacidad de tomar capturas de pantalla del contenido del campo (bandera FLAG_SECURE), aunque este comportamiento depende de la implementación específica del teclado. A partir de Android 8.0 (API 26), los teclados de contraseña admiten autocompletado a través de gestores de contraseñas si se establece el atributo importantForAutofill="yes".
Según Android Security Recommendations (2025), para campos de contraseña también se recomienda: establecer maxLength para evitar contraseñas muy largas (que podrían ser un vector de ataque a la base de datos), usar inputType="textPassword" junto con TextInputLayout y endIconMode="password_toggle" para que el usuario pueda verificar la contraseña ingresada antes de enviar el formulario.
<!-- Password field with show/hide icon -->
@+id/tilPasswordField
app:endIconMode="password_toggle">
@+id/etPasswordField
android:inputType="textPassword"
android:maxLength="64"
android:importantForAutofill="yes" />
</com.google.android.material.textfield.TextInputLayout>
La configuración programática de Keyboard Type permite cambiar dinámicamente el modo del teclado según el contexto o la entrada del usuario. Por ejemplo, al cambiar el tipo de campo (texto/número/fecha) o al cambiar la configuración regional. El método setInputType() acepta una máscara de bits InputType y actualiza inmediatamente el teclado si el campo está enfocado.
// Cambiar entre entrada de texto y numérica
fun switchInputType(field: EditText, isNumeric: Boolean) {
field.inputType = if (isNumeric) {
InputType.TYPE_CLASS_NUMBER or
InputType.TYPE_NUMBER_FLAG_DECIMAL
} else {
InputType.TYPE_CLASS_TEXT or
InputType.TYPE_TEXT_FLAG_CAP_SENTENCES
}
field.setSelection(field.text.length)
}
// Verificar si el campo es numérico
fun isNumericInput(field: EditText): Boolean {
val type = field.inputType
return (type and InputType.TYPE_MASK_CLASS) ==
InputType.TYPE_CLASS_NUMBER
}
// Verificar si la autocorrección está activada
fun isAutoCorrectEnabled(field: EditText): Boolean {
return (field.inputType and
InputType.TYPE_TEXT_FLAG_AUTO_CORRECT) != 0
}
Preguntas Frecuentes
Si no se especifica inputType, EditText utiliza por defecto TYPE_CLASS_TEXT con la bandera TYPE_TEXT_FLAG_MULTI_LINE. Esto significa un teclado QWERTY estándar y entrada multilínea. Para la mayoría de los campos, se recomienda especificar explícitamente inputType para garantizar un comportamiento correcto del teclado y el filtrado de caracteres.
Usa el atributo android:imeOptions="actionDone" en EditText. Esto reemplazará el botón Intro con un botón Hecho. Otras opciones: actionSearch (lupa), actionNext (flecha derecha), actionSend (enviar). Maneja la pulsación mediante OnEditorActionListener en el código.
No se puede desactivar la vibración para un campo específico — es una configuración del sistema controlada por el usuario en la configuración del teclado. Sin embargo, se puede evitar que aparezca el teclado por completo estableciendo el atributo android:focusable="false" en EditText o anulando la visualización mediante dispatchTouchEvent.
Establece android:inputType="none" o llama programáticamente a editText.setKeyListener(null). El campo mostrará texto, pero el teclado no aparecerá al enfocarse. El usuario podrá seleccionar y copiar texto, pero no editarlo. Una alternativa es usar TextView con textIsSelectable="true".
Después de llamar a setInputType(), es necesario volver a mostrar el teclado, ya que el sistema puede no actualizar el IME automáticamente. Llama a InputMethodManager.restartInput(view) para forzar una actualización. Si el campo no está enfocado, primero llama a requestFocus(), luego a restartInput.
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