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óntargetApiVersion
s. Por el momento, esto solo afecta algunos valores deInputType
, 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);