¿Cuáles son la semántica de cada constante de InputType?
Puede establecer un TextView
de inputType
en uno de los valores de InputType
para indicar que el texto escrito debe ser el nombre de una persona, el número de teléfono, etc. Incluso si el método de entrada no respeta esta sugerencia, TextView
utiliza un KeyListener
y / o TransformationMethod
para garantizar que sólo se pueden introducir caracteres relevantes o para tener efectos como enmascarar la contraseña. Incluso las banderas son más que simples indirectas: pueden cambiar el comportamiento de TextView
significativamente (el ejemplo más obvio es EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE
).
La documentación de Google es muy vaga sobre el efecto real de cada inputType
. ¿Qué caracteres se permiten en cada caso? ¿Cómo varía esto por localidad, si es que lo hace? Incluso si no hay una respuesta documentada y es probable que cambie entre versiones, todavía me gustaría saber el comportamiento esperado.
- Cómo encontrar texto visible en la vista de texto
- Dos estilos diferentes en un solo textview con diversa gravedad y hieght
- Las fuentes ttf personalizadas no se muestran correctamente en TextView en Android 4.4 KitKat
- Eliminar subrayado de AutoCompleteTextView a través de xml
- Cómo configurar el texto de TextView?
- Cómo configurar un oyente en el texto seleccionado en TextView
- Texto intermitente en la vista android
- Cómo invertir la dirección de la marquesina de un TextView
- Vista de texto editable al hacer clic
- Espacio de ancho cero con charecters especiales
- ¿Cómo hacer el espaciado entre letras en Android TextView?
- Envoltura de texto uniforme en TextView
- Cómo iniciar la barra de acción contextual para ver el texto de forma programática con opions por defecto copiar y seleccionar todo?
Puede averiguar esto inspeccionando el origen de las clases *KeyListener
, aunque por supuesto esto puede cambiarse en diferentes versiones o por personalizaciones de fabricantes o portadores. A continuación se basa en la fuente AOSP 4.3. Estos son solo los efectos que cada tipo tiene en Android: los métodos de entrada también utilizan los tipos como sugerencias para predecir mejor lo que el usuario probablemente escriba. Por ejemplo, aunque TYPE_TEXT_VARIATION_PERSON_NAME
sólo tiene el efecto de deshabilitar la revisión ortográfica, la IM puede responder a este tipo autocompletando desde un diccionario de nombres comunes en lugar de desde un diccionario de idioma.
Para experimentar con los tipos de entrada y las opciones de IME, pirateé una aplicación rápida que te permite seleccionarlas desde una lista en una GUI, por lo que no tienes que editar un diseño XML y reconstruir una aplicación para hacerlo. Si quieres obtener más información o comprobar cómo interactúan con una aplicación de mensajería instantánea determinada, descarga IM gratis de Google Play .
TYPE_NULL
Este es realmente documentado:
Esto debe interpretarse para significar que la conexión de entrada de destino no es rica, no puede procesar y mostrar cosas como texto candidato ni recuperar el texto actual, por lo que el método de entrada tendrá que ejecutarse en un modo limitado de "generar eventos clave", si lo apoya. Tenga en cuenta que es posible que algunos métodos de entrada no lo admitan, por ejemplo, un método de entrada basado en voz probablemente no será capaz de generar eventos clave aunque este indicador esté establecido.
Esto hace que suene como que es para casos en los que no está editando texto, pero al presionar una tecla en el IM se realizará alguna acción directamente. Pero de hecho, oculta el IM por completo. Desde el punto de vista de la aplicación, que casi nunca quieren esto: establecer si sólo desea un teclado de hardware para poder introducir texto.
Desde el punto de vista de IM, obtendrá este tipo pasó a onStartInput
mucho, por lo general cuando Android está a punto de ocultar el IM porque una actividad diferente está llegando al primer plano. Desea responder rápidamente a este tipo de entrada. Podría haber dos razones por las que funciona de esta manera, pero alguien involucrado en el diseño tendría que confirmar por qué:
-
Podría ser que el IM sepa que la edición está completamente terminada en esa ventana (a diferencia de
onFinishInput
, lo que significa simplemente que el IM está siendo ocultado), por lo que puede liberar memoria utilizada para diccionarios y similares hasta que se reinicie la edición. -
Podría ser parte de lo que permite que un teclado de hardware utilice las teclas de flecha para desplazarse, las teclas del acelerador del menú, etc., incluso cuando no se está introduciendo texto.
Clases
Tipos numéricos
TYPE_CLASS_NUMBER
le da los dígitos 0-9. Además, si agrega TYPE_NUMBER_FLAG_SIGNED
, tendrá +
o -
, pero sólo como primer carácter. Añadir TYPE_NUMBER_FLAG_DECIMAL
permite tener .
en cualquier posición, pero sólo una vez. Puede tener firmados y decimales. Por lo que puedo decir, esto no está localizado, por lo que los caracteres permitidos son los mismos, incluso para locales donde .
es el separador de miles y ,
es el punto decimal, o para locales con caracteres numéricos diferentes.
TYPE_CLASS_PHONE
permite tener los dígitos 0-9, así como cualquiera de #*+-(),/N.;
y el espacio. Puede tener esos caracteres en cualquier orden y cualquier número de veces: no hay comprobación de formato.
TYPE_CLASS_DATETIME | TYPE_DATETIME_VARIATION_DATE
TYPE_CLASS_DATETIME | TYPE_DATETIME_VARIATION_DATE
permite tener los dígitos 0-9 así como cualquiera de /-.
. Una vez más, no hay ningún cheque extra para el formato, por lo que puede tener en cualquier orden.
TYPE_CLASS_DATETIME | TYPE_DATETIME_VARIATION_TIME
TYPE_CLASS_DATETIME | TYPE_DATETIME_VARIATION_TIME
te permite tener los dígitos 0-9 así como :
y cualquiera de amp
(para escribir "am" o "pm", pero puedes usarlos en cualquier orden y posición). Ligeramente perversamente, no se puede tener espacio o. para "3 pm" o "2 pm" o incluso "2,30". Una vez más, no parece estar localizada.
TYPE_CLASS_DATETIME | TYPE_DATETIME_VARIATION_NORMAL
TYPE_CLASS_DATETIME | TYPE_DATETIME_VARIATION_NORMAL
obtiene 0-9 así como :/-
, espacio y amp
. Esto no incluye .
aunque se permite en una fecha.
Sobre la base de las observaciones anteriores, no puedo decir que recomiendo usar cualquiera de las clases anteriores. Todos parecen tener ausencias importantes e impedir la localización. Lo anterior son las únicas clases con restricciones de caracteres.
TYPE_CLASS_NUMBER | TYPE_NUMBER_VARIATION_PASSWORD
TYPE_CLASS_NUMBER | TYPE_NUMBER_VARIATION_PASSWORD
hace lo que usted esperaría: usa un TransformationMethod
para oscurecer los caracteres escritos.
Tipos de texto
En TYPE_CLASS_TEXT
, establecer TYPE_TEXT_VARIATION_EMAIL_ADDRESS
o TYPE_TEXT_VARIATION_EMAIL_SUBJECT
hace que una presión de la tecla enter mueva el foco al siguiente campo en lugar de insertar una nueva línea.
TYPE_TEXT_VARIATION_FILTER
evitará que el método de entrada pase al modo de pantalla completa (extraer).
TYPE_TEXT_VARIATION_PASSWORD
tiene el efecto obvio: utiliza un TransformationMethod
de TransformationMethod
para oscurecer los caracteres escritos. TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
todavía utiliza el TransformationMethod
para evitar que el texto se copie
Todas las siguientes variaciones de texto permiten la corrección ortográfica si TYPE_TEXT_FLAG_NO_SUGGESTIONS
no está establecido. Es decir, usar una clase que no es TYPE_CLASS_TEXT
o una variación que no está en esta lista tiene el mismo efecto que la configuración TYPE_TEXT_FLAG_NO_SUGGESTIONS
(que se describe más adelante).
-
TYPE_TEXT_VARIATION_NORMAL
-
TYPE_TEXT_VARIATION_EMAIL_SUBJECT
-
TYPE_TEXT_VARIATION_LONG_MESSAGE
-
TYPE_TEXT_VARIATION_SHORT_MESSAGE
-
TYPE_TEXT_VARIATION_WEB_EDIT_TEXT
Banderas
La presencia o ausencia de InputType.TYPE_TEXT_FLAG_MULTI_LINE
tiene efectos secundarios no obvios. Si la clase de tipo no es TYPE_CLASS_TEXT
, siempre es como si la bandera no estuviera establecida y TextView
entre en modo de una sola línea. El ajuste de lines
o lines
maxLines
a 1 sólo afecta a la forma en que se muestra el texto: no inicia el modo de línea única.
En modo de una sola línea: –
- la opción de elipse tiene por defecto finalizar
- presionar enter realiza la "acción del editor" o mueve el foco al siguiente campo (igual que para direcciones de correo electrónico o temas, arriba); de lo contrario, inserta una nueva línea
- presionando la lengüeta mueve el foco al campo siguiente, solamente si
TYPE_TEXT_FLAG_IME_MULTI_LINE
no se fija; de lo contrario, inserta un carácter de pestaña - las
imeOptions
pueden incluir una "acción del editor" para reemplazar la tecla enter en un teclado suave; en el modoTextView
,TextView
agregaráIME_FLAG_NO_ENTER_ACTION
a lasimeOptions
-
maxLines
se establece automáticamente en 1 - la adición de una nueva línea al campo (por ejemplo, utilizando
setText
) no tiene ningún efecto y un retorno de carro se reemplaza con un espacio de ancho cero (U + FEFF)
TYPE_TEXT_FLAG_CAP_*
Utilice TextUtils.getCapsMode
para decidir si se deben capitalizar cada carácter. Las reglas son un poco barrocas y no son locales. AFAICT, esto sólo tiene efecto si la configuración correspondiente está habilitada en el teclado predeterminado.
Cuando se establece TYPE_TEXT_FLAG_AUTO_CORRECT
, el espacio, la pestaña, la nueva línea, cualquier carácter de "puntuación final" de Unicode, o cualquiera de ,.!?"
Activará la corrección automática de la palabra anterior (en este contexto, es la secuencia más larga de letras Unicode y apóstrofes ) Si la palabra completa no tiene una corrección, continúa reintentando con subsecuencias más cortas Las correcciones vienen de un recurso de sistema fijo com.android.internal.R.xml.autotext
y están separadas de cualquier corrector ortográfico configurado.
TYPE_TEXT_FLAG_NO_SUGGESTIONS
(o las variaciones de texto enumeradas anteriormente) detiene el texto que se revisa ortográficamente. Esto evita que se muestre la lista de sugerencias de verificación ortográfica y también se resaltan las palabras mal escritas. El método de entrada puede seguir completando si lo desea.
Otras rarezas
TextView
seleccionar un TextView
normalmente selecciona la palabra tapped, pero si el tipo de entrada es uno de los siguientes, selecciona todo el texto en su lugar:
-
TYPE_CLASS_NUMBER
-
TYPE_CLASS_PHONE
-
TYPE_CLASS_DATETIME
(cualquier variación) -
TYPE_TEXT_VARIATION_URI
-
TYPE_TEXT_VARIATION_EMAIL_ADDRESS
-
TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS
-
TYPE_TEXT_VARIATION_FILTER