Un editor de método de entrada (IME) es un control para el usuario que le permite ingresar texto. Android proporciona un framework de método de entrada extensible que permite a las aplicaciones proporcionar a los usuarios métodos de entrada alternativos, como teclados en pantalla o entrada de voz. Después de instalar los IME, el usuario puede seleccionar uno de ellos. la configuración del sistema y usarla en todo el sistema. Solo se puede habilitar un IME a la vez.
Para agregar un IME al sistema Android, crea una aplicación para Android que contenga una clase que
extiende
InputMethodService
Además, sueles crear una "configuración" que pasa opciones al servicio del IME. Tú
también puede definir una IU de configuración que se muestra como parte de la configuración del sistema.
En esta página, se abarcan los siguientes temas:
- El ciclo de vida del IME
- Cómo declarar componentes del IME en el manifiesto de la aplicación
- La API de IME
- Cómo diseñar una IU de IME
- Envía texto de un IME a una aplicación
- Cómo trabajar con subtipos de IME
- Otras consideraciones de IME
Si no trabajaste con IME, lee el artículo de introducción. Métodos de entrada en pantalla antes de empezar.
El ciclo de vida del IME
En el siguiente diagrama, se describe el ciclo de vida de un IME:
En las siguientes secciones, se describe cómo implementar la IU y el código asociado con un IME que sigue este ciclo de vida.
Cómo declarar componentes de IME en el manifiesto
En el sistema Android, un IME es una aplicación que contiene un servicio especial de IME. El
el archivo de manifiesto de la aplicación debe declarar el servicio, solicitar los permisos necesarios, proporcionar una
filtro de intents que coincida con la acción action.view.InputMethod
y proporcionar metadatos
que define las características del IME. Además, para proporcionar una interfaz de configuración que permita a los
modificar el comportamiento del IME, puedes definir una "configuración actividad que se puede iniciar desde
Configuración del sistema.
El siguiente fragmento declara un servicio del IME. Se solicita el permiso
BIND_INPUT_METHOD
para permitir que el servicio conecte el IME al sistema, configura un filtro de intents que coincida con la acción
android.view.InputMethod
y define los metadatos para el IME:
<!-- Declares the input method service. --> <service android:name="FastInputIME" android:label="@string/fast_input_label" android:permission="android.permission.BIND_INPUT_METHOD"> <intent-filter> <action android:name="android.view.InputMethod" /> </intent-filter> <meta-data android:name="android.view.im" android:resource="@xml/method" /> </service>
El siguiente fragmento declara la actividad de configuración para el IME. Tiene un filtro de intents para
ACTION_MAIN
indica que esta actividad es el punto de entrada principal para la aplicación del IME:
<!-- Optional: an activity for controlling the IME settings. --> <activity android:name="FastInputIMESettings" android:label="@string/fast_input_settings"> <intent-filter> <action android:name="android.intent.action.MAIN"/> </intent-filter> </activity>
También se puede permitir el acceso a la configuración del IME directamente desde su IU.
La API del método de entrada
Las clases específicas de los IME se encuentran en la
android.inputmethodservice
y
android.view.inputmethod
paquetes. La clase KeyEvent
es
importante para manejar los caracteres del teclado.
La parte central de un IME es un componente de servicio, una clase que extiende
InputMethodService
Además de implementar el ciclo de vida normal del servicio, esta
tiene devoluciones de llamada para proporcionar la IU de tu IME, controlar las entradas del usuario y enviar texto al
que está enfocada. De forma predeterminada, la clase InputMethodService
proporciona la mayoría de los
para administrar el estado y la visibilidad del IME y comunicarse
campo de entrada.
Las siguientes clases también son importantes:
BaseInputConnection
-
Define el canal de comunicación desde un
InputMethod
de vuelta a la aplicación que recibe su entrada. Lo usas para leer texto alrededor del cursor, confirmar el mensaje en el cuadro de texto y enviar eventos clave sin procesar a la aplicación. Las aplicaciones deben extender esta clase en lugar de implementar la interfaz baseInputConnection
KeyboardView
-
Una extensión de
View
que Renderiza un teclado y responde a los eventos de entrada del usuario. El diseño del teclado se especifica mediante un instancia deKeyboard
, que puedes definir en un archivo en formato XML.
Cómo diseñar la IU del método de entrada
Los IME tienen dos elementos visuales principales: la vista de entrada y la candidates. Solo tienes que implementar los elementos que sean relevantes para la método de entrada que estás diseñando.
Vista Entrada
La vista de entrada es la IU en la que el usuario ingresa texto en forma de teclas, escritura a mano o
y gestos clave. Cuando se muestra el IME por primera vez, el sistema llama al
onCreateInputView()
devolución de llamada. En tu implementación de este método, crea el diseño que deseas mostrar en el IME.
y mostrar el diseño al sistema. En el siguiente fragmento, se muestra un ejemplo de cómo implementar
el método onCreateInputView()
:
Kotlin
override fun onCreateInputView(): View { return layoutInflater.inflate(R.layout.input, null).apply { if (this is MyKeyboardView) { setOnKeyboardActionListener(this@MyInputMethod) keyboard = latinKeyboard } } }
Java
@Override public View onCreateInputView() { MyKeyboardView inputView = (MyKeyboardView) getLayoutInflater().inflate(R.layout.input, null); inputView.setOnKeyboardActionListener(this); inputView.setKeyboard(latinKeyboard); return inputView; }
En este ejemplo, MyKeyboardView
es una instancia de una implementación personalizada de
KeyboardView
que renderiza un Keyboard
.
Vista Candidatos
La vista Candidatos es la IU en la que el IME muestra posibles correcciones o sugerencias de palabras.
que seleccione el usuario. En el ciclo de vida del IME, el sistema llama
onCreateCandidatesView()
cuando esté listo para mostrar la vista de candidatos. En la implementación de este método, devuelve un
que muestra sugerencias de palabras, o que muestra un valor nulo si no quieres mostrar nada. Un valor nulo
esta respuesta es el comportamiento predeterminado, por lo que no tienes que implementarla si no proporcionas
sugerencias.
Consideraciones de diseño de la IU
En esta sección, se describen algunas consideraciones de diseño de la IU para los IME.
Cómo procesar varios tamaños de pantalla
La IU de tu IME debe poder adaptarse a diferentes tamaños de pantalla y controlar la orientación y vertical. En el modo IME de pantalla no completa, deja espacio suficiente para que la aplicación mostrar el campo de texto y el contexto asociado, de modo que no ocupe más de la mitad de la pantalla el IME. En el modo IME de pantalla completa, esto no es un problema.
Cómo procesar diferentes tipos de entrada
Los campos de texto de Android te permiten establecer un tipo de entrada específico, como texto de formato libre, números, URLs, direcciones de correo electrónico y cadenas de búsqueda. Cuando implementas un nuevo IME, detecta el tipo de entrada de cada y proporcionan la interfaz adecuada para él. Sin embargo, no tienes que configurar tu IME para verifica si el usuario ingresa texto válido para el tipo de entrada. Esto es responsabilidad del que posee el campo de texto.
Por ejemplo, esta es la interfaz que proporciona el IME latino para el texto de la plataforma de Android. entrada:
Esta es la interfaz que proporciona el IME latino para la plataforma de Android. entrada numérica:
Cuando un campo de entrada recibe el foco y se inicia el IME, el sistema llama
onStartInputView()
,
y pasar un
Objeto EditorInfo
que contiene detalles sobre el tipo de entrada y otros atributos del campo de texto. En este objeto,
el
inputType
contiene el tipo de entrada del campo de texto.
El campo inputType
es un int
que contiene patrones de bits para varios
configuración del tipo de entrada. Para probarlo para el tipo de entrada del campo de texto, enmascáralo con la constante.
TYPE_MASK_CLASS
,
así:
Kotlin
inputType and InputType.TYPE_MASK_CLASS
Java
inputType & InputType.TYPE_MASK_CLASS
El patrón de bits del tipo de entrada puede tener uno de varios valores, entre los que se incluyen los siguientes:
TYPE_CLASS_NUMBER
- Es un campo de texto para ingresar números. Como se ilustra en la figura 3, el IME latino muestra una teclado numérico para campos de este tipo.
TYPE_CLASS_DATETIME
- Es un campo de texto para ingresar una fecha y una hora.
TYPE_CLASS_PHONE
- Es un campo de texto para ingresar números de teléfono.
TYPE_CLASS_TEXT
- Es un campo de texto para ingresar cualquier carácter compatible.
Estas constantes se describen con más detalle en la documentación de referencia de
InputType
El campo inputType
puede contener otros bits que indiquen una variante del campo de texto.
por ejemplo:
TYPE_TEXT_VARIATION_PASSWORD
- Es una variante de
TYPE_CLASS_TEXT
para ingresar contraseñas. El método de entrada muestra caracteres ordinarios en lugar del texto real. TYPE_TEXT_VARIATION_URI
- Una variante de
TYPE_CLASS_TEXT
para ingresar URLs web y otro recurso uniforme Identificadores (URI). TYPE_TEXT_FLAG_AUTO_COMPLETE
- Una variante de
TYPE_CLASS_TEXT
para ingresar texto que la aplicación la función autocompletar a partir de un diccionario, una búsqueda u otro servicio.
Enmascara inputType
con la constante adecuada cuando pruebes estas variantes. El
las constantes de enmascaramiento disponibles se enumeran en la documentación de referencia para InputType
.
Cómo enviar texto a la aplicación
A medida que el usuario ingresa texto con tu IME, puedes enviarlo a la aplicación enviando mensajes
eventos clave o editando el texto alrededor del cursor en el campo de texto de la aplicación. En cualquier caso,
usa una instancia de InputConnection
para entregar el texto. Para obtener esta instancia, llama a
InputMethodService.getCurrentInputConnection()
Cómo editar el texto que aparece alrededor del cursor
Cuando estás manejando la edición de texto existente, algunos métodos útiles en
BaseInputConnection
son los siguientes:
-
getTextBeforeCursor()
- Muestra un
CharSequence
. que contiene la cantidad de caracteres solicitados antes de la posición actual del cursor. -
getTextAfterCursor()
- Muestra un
CharSequence
que contiene la cantidad de caracteres solicitados a continuación. la posición actual del cursor. -
deleteSurroundingText()
- Borra la cantidad especificada de caracteres antes y después de la posición actual del cursor.
-
commitText()
- Confirma un
CharSequence
en el campo de texto y establece una nueva posición del cursor.
Por ejemplo, el siguiente fragmento muestra cómo reemplazar los cuatro caracteres a la izquierda de la cursor con el texto "Hello!":
Kotlin
currentInputConnection.also { ic: InputConnection -> ic.deleteSurroundingText(4, 0) ic.commitText("Hello", 1) ic.commitText("!", 1) }
Java
InputConnection ic = getCurrentInputConnection(); ic.deleteSurroundingText(4, 0); ic.commitText("Hello", 1); ic.commitText("!", 1);
Admite la redacción de texto antes de confirmarlo
Si tu IME predice texto o requiere varios pasos para redactar un glifo o una palabra, puedes mostrar el
progresan en el campo de texto hasta que el usuario confirma la palabra, y luego puedes reemplazar la parte
la composición con el texto completo. Puedes darle un tratamiento especial al texto agregando una
span cuando lo pases al
setComposingText()
En el siguiente fragmento, se demuestra cómo mostrar el progreso en un campo de texto:
Kotlin
currentInputConnection.also { ic: InputConnection -> ic.setComposingText("Composi", 1) ic.setComposingText("Composin", 1) ic.commitText("Composing ", 1) }
Java
InputConnection ic = getCurrentInputConnection(); ic.setComposingText("Composi", 1); ic.setComposingText("Composin", 1); ic.commitText("Composing ", 1);
Cómo interceptar eventos clave de hardware
Aunque la ventana del método de entrada no tiene un enfoque explícito, recibe eventos clave de hardware. y puedes consumirlos o reenviarlos a la aplicación. Por ejemplo, es posible que quieras consumir las teclas direccionales para navegar dentro de la IU de la selección de candidatos durante la composición. También es posible que quieras capturar la tecla de retroceso para descartar cualquier diálogo que se origine en el método de entrada. en la ventana modal.
Para interceptar claves de hardware, anular
onKeyDown()
y
onKeyUp()
Llama al método super()
para las claves que no deseas procesar.
Cómo crear un subtipo de IME
Los subtipos permiten que el IME exponga varios idiomas y modos de entrada compatibles con él. Un subtipo puede representan lo siguiente:
- Una configuración regional, como en_US o fr_FR
- Un modo de entrada, como voz, teclado o escritura a mano
- Otros estilos, formularios o propiedades de entrada específicos del IME, como teclado de 10 teclas o QWERTY diseños de teclado
El modo puede ser cualquier texto, como "teclado" o "voz". Un subtipo también puede exponer una combinación de estos.
La información de subtipo se usa para un diálogo de selector de IME que está disponible en la barra de notificaciones. y la configuración del IME. La información también permite que el framework muestre un subtipo específico de un IME directamente. Cuando creas un IME, debes usar la facilidad de subtipo, ya que ayuda al usuario a identificar y para alternar entre diferentes modos e idiomas del IME.
Define subtipos en uno de los archivos de recursos XML del método de entrada mediante el uso de
<subtype>
. En el siguiente fragmento de código, se define un IME con dos subtipos: un
subtipo de teclado para la configuración regional de inglés de EE.UU. y otro subtipo de teclado para el idioma francés
configuración regional para Francia:
<input-method xmlns:android="http://schemas.android.com/apk/res/android" android:settingsActivity="com.example.softkeyboard.Settings" android:icon="@drawable/ime_icon"> <subtype android:name="@string/display_name_english_keyboard_ime" android:icon="@drawable/subtype_icon_english_keyboard_ime" android:languageTag="en-US" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="somePrivateOption=true" /> <subtype android:name="@string/display_name_french_keyboard_ime" android:icon="@drawable/subtype_icon_french_keyboard_ime" android:languageTag="fr-FR" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="someVariable=30,someInternalOption=false" /> <subtype android:name="@string/display_name_german_keyboard_ime" ... /> </input-method>
Para asegurarte de que tus subtipos estén etiquetados correctamente en la IU, usa "%s" para obtener una etiqueta de subtipo que es igual a la etiqueta de configuración regional del subtipo. Esto se demuestra en los siguientes dos fragmentos de código. El El primer fragmento muestra parte del archivo XML del método de entrada:
<subtype android:label="@string/label_subtype_generic" android:imeSubtypeLocale="en_US" android:icon="@drawable/icon_en_us" android:imeSubtypeMode="keyboard" />
El siguiente fragmento es parte del archivo strings.xml
del IME. El recurso de cadenas
label_subtype_generic
, que utiliza la definición de la IU del método de entrada para establecer la
del subtipo, se define de la siguiente manera:
<string name="label_subtype_generic">%s</string>
Esta configuración hace que el nombre visible del subtipo coincida con la configuración regional. Por ejemplo, en cualquier configuración regional en inglés, el nombre visible es "English (United States)".
Cómo seleccionar subtipos de IME de la barra de notificaciones
El sistema Android administra todos los subtipos expuestos por todos los IME. Los subtipos de IME se tratan como modos de el IME al que pertenecen. El usuario puede navegar desde la barra de notificaciones o la app de Configuración hasta una de subtipos de IME disponibles, como se muestra en la siguiente figura:
Cómo seleccionar los subtipos de IME desde Configuración del sistema
El usuario también puede controlar el uso de los subtipos en la sección Idioma y panel de configuración de entrada en la configuración del sistema.
.Cómo alternar entre subtipos de IME
Puedes permitir que los usuarios cambien fácilmente entre los subtipos de IME proporcionando una tecla de cambio, como la ícono de idioma con forma de globo terráqueo en el teclado. De esta manera, se mejora la usabilidad del teclado y es conveniente para el usuario. Para habilitar este cambio, sigue estos pasos:
- Declara
supportsSwitchingToNextInputMethod = "true"
en los archivos de recursos XML del método de entrada. La declaración debe ser similar al siguiente fragmento de código:<input-method xmlns:android="http://schemas.android.com/apk/res/android" android:settingsActivity="com.example.softkeyboard.Settings" android:icon="@drawable/ime_icon" android:supportsSwitchingToNextInputMethod="true">
- Llama al
shouldOfferSwitchingToNextInputMethod()
. - Si arroja un valor verdadero, muestra una tecla de cambio.
- Cuando el usuario presione la tecla de cambio, llama
switchToNextInputMethod()
, pasa false. Un valor falso le indica al sistema que trate todos los subtipos por igual, independientemente de a qué IME pertenecen. Para especificar un valor verdadero, se requiere que el sistema recorra los subtipos en el el IME actual.
Consideraciones generales de IME
A continuación, se incluyen otros aspectos que debes tener en cuenta cuando implementas tu IME:
- Ofrece a los usuarios una forma de configurar opciones directamente desde la IU del IME.
- Proporcionar una forma para que los usuarios cambien a un IME diferente directamente desde la IU del método de entrada. porque es posible que se instalen varios IME en el dispositivo.
- Abre la IU del IME rápido. Precarga o carga a pedido cualquier recurso grande para que los usuarios ver el IME en cuanto presione un campo de texto. Recursos de caché y vistas para invocaciones posteriores del método de entrada.
- Libera asignaciones de memoria grandes inmediatamente después de que se oculte la ventana del método de entrada. que las aplicaciones tengan suficiente memoria para ejecutarse. Usa un mensaje retrasado para liberar recursos si el IME se oculta durante unos segundos.
- Asegúrate de que los usuarios puedan ingresar tantos caracteres como sea posible para el idioma o la configuración regional asociados con el IME. Los usuarios pueden usar signos de puntuación en contraseñas o nombres de usuario, por lo que tu IME Se deben proporcionar muchos caracteres diferentes para permitir que los usuarios ingresen una contraseña y accedan a la dispositivo.