type textemailaddress textcapwords studio password number inputtype example edittext android android-input-method

textemailaddress - input type password android



Comportamiento de imeOptions, imeActionId y imeActionLabel (4)

Soy bastante nuevo en el desarrollo nativo de Android, y estoy tratando de descubrir cómo personalizar los botones de acción de IME. Revisé la documentación de Google, pero puedo encontrar muy poca información sobre el comportamiento esperado.

De la guía oficial entiendo que el botón de acción del teclado se puede configurar usando los atributos:

  • android: imeOptions puede configurar el texto / ID del botón que se muestra cerca de la tecla de espacio para algunos valores predefinidos (por ejemplo, actionGo establece la etiqueta de la tecla en Ir y la ID en 2)
  • android: imeActionLabel establece la etiqueta del botón que se muestra dentro del área de entrada cuando el teclado está en pantalla completa, generalmente en modo horizontal. Se puede establecer en cualquier valor de cadena.
  • android: imeActionId igual que el anterior, pero establezca el ID numérico pasado al método de devolución de llamada

Pero después de algunos intentos empíricos he encontrado un comportamiento diferente entre el nivel API 15 y los siguientes niveles API.

Configuré un elemento simple EditText con los siguientes atributos:

<EditText ... android:imeOptions="actionGo" android:imeActionLabel="Custom" android:imeActionId="666" android:inputType="text"/>

y he comprobado el efecto con los diferentes niveles de API tanto en modo retrato como en modo paisaje. Aquí está el resultado.

Nivel de API 15 - 4.0.3

En modo retrato, la etiqueta de la tecla es Ir y la identificación de la acción pasada al método de devolución de llamada es 2, de acuerdo con la configuración imeOptions.

En modo apaisado, la etiqueta / id clave es Go / 2 como modo vertical, mientras que el botón que se muestra en el área de entrada es Personal / 666, según los atributos imeActionLabel e imeActionId.

API niveles 16, 17 y 18 - 4.1.2, 4.2.2 y 4.3

Tanto en modo vertical como horizontal, la tecla y el botón se muestran con una etiqueta personalizada y están vinculados a la identificación 666, ignorando el atributo imeOptions.

Esta falta de coincidencia en el comportamiento es bastante molesta porque:

  • con nivel de API> = 16 no puede distinguir entre botón de tecla y botón de área de entrada
  • con nivel de API = 15 no puede establecer ningún texto personalizado para el botón de la tecla.

¿Sabes cómo obtener esto en API 15 y 16+? ¿O si hay una forma de obtener un comportamiento consistente en todas (o al menos en parte) las versiones de API?

Tal vez me falta algo en la configuración de IME que pueda justificar el comportamiento diferente ...

¡Muchas gracias!


Cuando comienzas un nuevo proyecto de Android, proporciona una buena pista para tu pregunta. Hay una actividad llamada LoginActivity que puede crear como una pantalla de inicio de sesión predeterminada. Esta actividad producirá un EditText como tal:

<EditText android:id="@+id/password" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/prompt_password" android:imeActionId="@+id/login" android:imeActionLabel="@string/action_sign_in_short" android:imeOptions="actionUnspecified" android:inputType="textPassword" android:maxLines="1" android:singleLine="true"/>

Ahora, si lee la documentation , sabrá que el atributo imeOptions permite especificar acciones adicionales para un campo de texto. Por ejemplo, el teclado que aparece tiene una acción en la esquina inferior derecha como "Siguiente". Usando imeOptions puedes seleccionar otra acción de una lista predefinida proporcionada por Android. Puede especificar algo como "actionSend" o "actionSearch".

Una vez que lo hagas, para tu actividad, puedes escuchar esa acción usando el controlador de eventos setOnEditorActionListener :

mPasswordView = (EditText) findViewById(R.id.password); mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) { if (id == R.id.login || id == EditorInfo.IME_NULL) { attemptLogin(); return true; } return false; } });

Observe cómo imeActionId al imeActionId aquí. Es otro método para hacer EditText en EditText en su actividad, a la vez que tiene la flexibilidad de cambiar la acción en la entrada del teclado.


De hecho, depende de la aplicación de método de entrada, no del marco de Android en sí, decidir qué hacer con los valores que establezca.

El marco de trabajo de Android solo pasa los valores que estableces al método de entrada, que luego puede elegir qué botones mostrar en el teclado o un EditText de EditText "extraído" en la vista de pantalla completa. El marco de Android influye en la EditorInfo del EditorInfo de dos maneras:

  • Lo pasa a través de EditorInfo.makeCompatible para garantizar que los valores que contiene sean compatibles entre el teclado y la aplicación targetApiVersion s. Por el momento, esto solo afecta algunos valores de InputType , no la acción del editor, pero esto podría cambiar si se introducen nuevas acciones del editor (o configuraciones completamente nuevas).

  • Establece el comportamiento predeterminado para el método de entrada, incluido el comportamiento en los editores de pantalla completa. Si el método de entrada elige no anular este comportamiento predeterminado, podría terminar con un comportamiento diferente entre las versiones de Android. Muchos teclados eligen establecer su propio comportamiento, de forma coherente entre las versiones de Android.

Por esa razón, no es tan simple decir que cierto campo de EditorInfo tiene cierto efecto en una versión dada, y no hay manera de garantizar un comportamiento consistente, incluso en una versión de Android. Todo lo que hace es proporcionar pistas sobre el método de entrada, que elige cómo presentarlas al usuario.


Si alguien está diseñando un teclado personalizado para Android y tiene un problema con la etiqueta de la tecla Intro, debe hacer lo siguiente. En la muestra del teclado personalizado de Android tenemos el siguiente método en SoftKeyboard.java:

@Override public void onStartInput(EditorInfo attribute, boolean restarting) { super.onStartInput(attribute, restarting); . . // the implementation . mCurKeyboard.setImeOptions(getResources(), attribute.imeOptions); }

Cambie la última línea a la siguiente línea:

mCurKeyboard.setImeOptions(getResources(), attribute);

Ahora en LatinKeyboard.java cambia el método setImeOptions como abajo:

void setImeOptions(Resources res, EditorInfo ei) { if (mEnterKey == null) { return; } switch (ei.imeOptions & (EditorInfo.IME_MASK_ACTION | EditorInfo.IME_FLAG_NO_ENTER_ACTION)) { case EditorInfo.IME_ACTION_SEND: mEnterKey.iconPreview = null; mEnterKey.icon = null; mEnterKey.label = res.getText(R.string.label_send_key); break; case EditorInfo.IME_ACTION_GO: mEnterKey.iconPreview = null; mEnterKey.icon = null; mEnterKey.label = res.getText(R.string.label_go_key); break; case EditorInfo.IME_ACTION_NEXT: mEnterKey.iconPreview = null; mEnterKey.icon = null; mEnterKey.label = res.getText(R.string.label_next_key); break; case EditorInfo.IME_ACTION_SEARCH: mEnterKey.icon = res.getDrawable(R.drawable.sym_keyboard_search); mEnterKey.label = null; break; default: mEnterKey.iconPreview = null; mEnterKey.label = res.getText(R.string.label_enter_key); mEnterKey.icon = null; break; } if (ei.actionLabel != null) { mEnterKey.iconPreview = null; mEnterKey.icon = null; mEnterKey.label = ei.actionLabel; } }

Ahora su teclado personalizado muestra la etiqueta adecuada según lo definido en el archivo xml para imeActionLabel.


Simplemente llame .setImeActionLabel() programáticamente en códigos java para establecer actionID (nuevamente) a su deseada.

editText.setImeActionLabel(getString(R.string.xxx), EditorInfo.IME_ACTION_GO);