android - style - Establecer EditText imeOptions en actionNext no tiene ningún efecto cuando se usan dígitos
propiedades edittext android (6)
Aquí hay una solución simplificada con el botón del teclado del software "Siguiente":
final String NOT_ALLOWED_CHARS = "[^a-zA-Z0-9]+";
final EditText editText = (EditText) findViewById(R.id.editText);
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {}
@Override
public void afterTextChanged(Editable s) {
if (!TextUtils.isEmpty(s)) {
// remove the listener to avoid StackoverflowException
editText.removeTextChangedListener(this);
// replace not allowed characters with empty strings
editText.setText(s.toString().replaceAll(NOT_ALLOWED_CHARS, ""));
// setting selection moves the cursor at the end of string
editText.setSelection(editText.getText().length());
// add the listener to keep watching
editText.addTextChangedListener(this);
}
}
});
Aquí la expresión regular [^a-zA-Z0-9]+
corresponde a los valores permitidos de android:digits
del EditText
en cuestión.
Aquí mi edittext: -
<com.os.fastlap.util.customclass.EditTextPlayRegular
android:id="@+id/full_name_et"
style="@style/Edittext_white_13sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/_5sdp"
android:background="#00ffffff"
android:digits="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
android:imeOptions="actionNext"
android:inputType="text"
android:maxLength="20"
android:maxLines="1"
android:nextFocusDown="@+id/last_name_et"
android:textCursorDrawable="@null" />
Cuando elimino un digit
en el texto de edición funciona bien, pero con imeOptions
digit
no funciona. Pero una cosa sorprendente si uso singleLine
lugar de maxLines funciona bien. Pero singleLine
ahora está en desuso. No puedo eliminar el dígito en mi edittext y no quiero usar el método en desuso . Cualquiera puede resolver este problema. Gracias en adavance
El código de solución para su solución es el siguiente,
Archivo XML
<EditText
android:id="@+id/full_name_et"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5sp"
android:background="#00ffffff"
android:imeOptions="actionNext"
android:inputType="text"
android:maxLines="1"
android:maxLength="20"
android:textCursorDrawable="@null" />
Java:
final EditText edtfirstName = (EditText) findViewById(R.id.full_name_et);
edtfirstName.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
if (charSequence.toString().startsWith(" ")) {
String result = charSequence.toString().replace(" ", "").replaceAll("[^a-zA-Z]+", "");
if (!charSequence.toString().equals(result)) {
edtfirstName.setText(result);
edtfirstName.setSelection(result.length());
}
} else {
String result = charSequence.toString().replaceAll("[^a-zA-Z ]+", "");
if (!charSequence.toString().equals(result)) {
edtfirstName.setText(result);
edtfirstName.setSelection(result.length());
}
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
El problema es que está haciendo clic en la tecla Intro en lugar de en la acción Siguiente que necesita para mover el cursor al siguiente EditarTexto
Especifique la acción del método de entrada
La mayoría de los métodos de entrada flexibles proporcionan un botón de acción del usuario en la esquina inferior que es apropiado para el campo de texto actual. Por defecto, el sistema usa este botón para una acción Siguiente o Hecho a menos que su campo de texto permita texto de varias líneas (como android: inputType = "textMultiLine"), en cuyo caso el botón de acción es un retorno de carro. Sin embargo, puede especificar acciones adicionales que podrían ser más apropiadas para su campo de texto, como Enviar o Ir.
Causa retorno de carro para su botón de acción. Entonces, eso significa que no se dispara android:nextFocusDown
En primer lugar, veamos cuál es la diferencia entre singleLine que está en desuso y maxLines
linea sola
Cuando configura android:singleLine="true"
una línea de texto está en EditText visible, pero la tecla Enter no está visible en el teclado
lineas maximas
cuando configura el atributo android:maxLines
con el valor particular, solo la misma cantidad de texto de línea es visible en EditText e ingrese la tecla en el teclado también visible para Ingreso.
Por lo tanto, cuando haga clic en el botón de acción, se activará Enter Action según su código. También debe cambiar su atributo inputType con android:inputType="textMultiLine"
si usa el atributo android:maxLines
lineas maximas
agregado en el nivel de API 1 int maxLines Hace que TextView sea como máximo esta cantidad de líneas. Cuando se usa en un texto editable, el valor del atributo inputType se debe combinar con el indicador textMultiLine para que se aplique el atributo maxLines.
Puede ser un valor entero, como "100".
Cuando personalicé su código con los atributos correctos, todavía estaba disparando la tecla Enter en lugar de IME_ACTION_NEXT que desea. Creo que no resolvió el problema debido a
textMultiLine Se puede combinar con texto y sus variaciones para permitir múltiples líneas de texto en el campo. Si este indicador no está configurado, el campo de texto estará restringido a una sola línea. Corresponde a TYPE_TEXT_FLAG_MULTI_LINE.
TYPE_TEXT_FLAG_MULTI_LINE
agregado en el nivel 3 de la API int TYPE_TEXT_FLAG_MULTI_LINE Marcador para TYPE_CLASS_TEXT: se pueden ingresar varias líneas de texto en el campo. Si este indicador no está configurado, el campo de texto estará restringido a una sola línea. El IME también puede elegir no mostrar una tecla Intro cuando este indicador no está configurado, ya que no debería haber necesidad de crear nuevas líneas.
Valor constante: 131072 (0x00020000)
SOLUCIÓN:
Subclase EditText y ajuste las opciones de IME. Después de eso, no necesitas android:maxLines
o android:singleLine
atributos de una android:singleLine
.
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
InputConnection connection = super.onCreateInputConnection(outAttrs);
int imeActions = outAttrs.imeOptions&EditorInfo.IME_MASK_ACTION;
if ((imeActions&EditorInfo.IME_ACTION_NEXT) != 0) {
// clear the existing action
outAttrs.imeOptions ^= imeActions;
// set the DONE action
outAttrs.imeOptions |= EditorInfo.IME_ACTION_NEXT;
}
if ((outAttrs.imeOptions&EditorInfo.IME_FLAG_NO_ENTER_ACTION) != 0) {
outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
}
return connection;
}
También puedes consultar otra publicación aquí . He reconfigurado la respuesta aceptada de esta publicación en tu propósito
puedes usar
android:lines="1"
en lugar de
android:maxLines
o
android:singleLine="true".
Sé que has probado muchas soluciones, prueba con
android:lines="1"
estos si no has intentado antes.
android:digits
especifica que EditText tiene un método de entrada numérica, según los documentos
Puedes usar android:inputType="personName"
para lograr lo mismo que tus digits
actuales attr
android:maxLines
only Hace que TextView sea como máximo esta cantidad de líneas, no impide que el usuario ingrese más caracteres.
Lo mismo con android:lines
que solo hacen que TextView sea exactamente así de muchas líneas.