studio ontextchanged aftertextchanged addtextchangedlistener java android string android-edittext textwatcher

java - ontextchanged - textwatcher android



ValidaciĆ³n de EditText con TextWatcher (4)

Después de algunos headbanging, finalmente encontré la solución. Parece que s.append (filtered_str) después de que s.clear () funcione. No sé por qué no ha funcionado antes.

Tengo un Diálogo con EditText y un botón. Este EditText nombrará la tabla de la base de datos que crearé, por lo que es de la mayor importancia que esté validada. Entonces me gustaría plantear 2 preguntas:

1) Esto es bastante simple, pero no pude encontrarlo en ninguna parte: ¿qué caracteres puede aceptar un nombre de tabla de base de datos? ¿Puede aceptar números? ¿Y un número puede ser el primer personaje?

2) EditText validar EditText usando TextWtacher . Aquí está el código:

et_name.addTextChangedListener(new TextWatcher() { public void afterTextChanged(Editable s) { String filtered_str = s.toString(); if (filtered_str.matches(".*[^a-z^0-9].*")) { filtered_str = filtered_str.replaceAll("[^a-z^0-9]", ""); s.clear(); // s.insert(0, filtered_str); Toast.makeText(context, "Only lowercase letters and numbers are allowed!", Toast.LENGTH_SHORT).show(); } } public void beforeTextChanged(CharSequence s, int start, int count, int after) {} public void onTextChanged(CharSequence s, int start, int before, int count) {} });

Actualmente, si el usuario inserta cualquier carácter que no sean letras minúsculas y números, se borra el cuadro de texto. Si s.insert(0, filtered_str); para poder reemplazar EditText con la cadena filtrada, mi aplicación se cuelga. ¿Y adivina qué encuentro en la depuración?

ERROR / AndroidRuntime (2454): java.lang.StackOverflowError = D

La pregunta es ... ¿cómo puedo reemplazar el texto s?

-> s.replace(0, s.toString().length(), filtered_str); (eliminar a la clara, por supuesto) no parece funcionar tampoco.


El problema es que cuando llamas al método de inserción, el método de cambio de texto se vuelve a llamar. Esto da como resultado un círculo vicioso, por lo tanto, el desbordamiento de la pila. Puede evitar esto al no reemplazar una cadena que está formateada correctamente.


¡Oye! Estoy intentando algo similar al forzar que el texto de entrada sea todo en minúscula; s.clear () seguido de s.append () causa un también (o inmóvil).

¿Por qué Android nos pone a través de ''aros'' para forzar la conversión a minúsculas?

Debido a que el uso de TextWatcher estaba fallando (con razón ... y no podía entender cómo trabajar en los tramos), miré TransformationMethod.

El primer intento fue hacer un TransformationMethod en línea en EditText con algo como esto:

et.setTransformationMethod(new TransformationMethod() { public void onFocusChanged(View view, CharSequence sourceText, boolean focused, int direction, Rect previouslyFocusedRect) { } public CharSequence getTransformation(CharSequence source, View view) { String ret = source.toString().toLowerCase(); System.out.println(ret); return ret; } });

Esto causó un bloqueo debido a IndexArrayOutOfBounds tan pronto como escribí un solo carácter en el ET ... no pude entender por qué.

Entonces, revisé el código de PasswordTransformation y luego ReplacementTransformation: ambos parecen muy complicados y no quería molestarme con todo eso?

Luego, desprotegió la subclase SinglelineTransformation, que era simple ... así que creé LowerCaseTransformation como subclase de ReplacementTransformation de la siguiente manera:

public class LowerCaseReplacement extends ReplacementTransformationMethod { private static final char[] ORIG = { ''A'', ''B'', ''C'', ''D'', ''E'', ''F'', ''G'', ''H'', ''I'', ''J'', ''K'', ''L'', ''M'', ''N'', ''O'', ''P'', ''Q'', ''R'', ''S'', ''T'', ''U'', ''V'', ''W'', ''X'', ''Y'', ''Z'' }; private static final char[] REPS = { ''a'', ''b'', ''c'', ''d'', ''e'', ''f'', ''g'', ''h'', ''i'', ''j'', ''k'', ''l'', ''m'', ''n'', ''o'', ''p'', ''q'', ''r'', ''s'', ''t'', ''u'', ''v'', ''w'', ''x'', ''y'', ''z'' }; private static LowerCaseReplacement singleton; @Override protected char[] getOriginal() { return ORIG; } @Override protected char[] getReplacement() { return REPS; } public static LowerCaseReplacement getInstance() { if (singleton == null) singleton = new LowerCaseReplacement(); return singleton; }

}

y agregando este xform a et ... como en et.setTransformationMethod (LowerCaseReplacement.getInstnace ()) ...

¡¡Esto funciona!!

Si alguien tiene una mejor solución, ¡por favor ilumine!


private TextWatcher listenerTextChangedFiltro = new TextWatcher() { public void afterTextChanged(Editable editable) { final String textoFiltrado = StaticString.filterTextCustom(String.valueOf(editable.toString().toLowerCase())); if (!textoFiltrado.equals(editable.toString().toLowerCase())) { editable.clear(); editable.append(textoFiltrado); } } };