¿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.

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é:

  1. 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.

  2. 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 modo TextView , TextView agregará IME_FLAG_NO_ENTER_ACTION a las imeOptions
  • 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
  • ¿Cómo puedo mostrar elipses en mi TextView si es mayor que la línea 1?
  • Abrir vínculos de TextView en otra actividad, no en el navegador predeterminado
  • El tamaño de fuente de TextView en la aplicación Android cambia al cambiar el tamaño de la fuente de la configuración nativa
  • Cómo hacer que un TextView parezca un encabezado PreferenciaCategoría de un ajuste
  • Android: ¿Cómo puedo actualizar mi textView en un fragmento
  • TextView que está vinculado y seleccionable?
  • Android - ¿Por qué autolink ignora la ruta raíz de una URL?
  • ¿Cómo puedo poner un borde alrededor de una vista de texto de Android?
  • Android TextView Scrollable
  • Barra de herramientas de selección de texto no visible en las versiones de pre-malvavisco sin ActionBar
  • Cómo cambiar el texto de TextView en el cambio de texto de EditText?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.