Cómo cambiar TextView texto en DataChange sin llamada atrás TextWatcher Listener
TextView textView=new TextView(context); textView.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { s.append("A"); } });
Si añadimos un TextWatcher
a un TextView
, y quiero anexar una letra a este TextView
, cada vez que el usuario escribe una letra en él, pero esto mantiene volver a llamar al Listener TextWatcher
, por lo que a StackOverFlow error
, Agregar un texto sin volver a llamar al Listener TextWatcher
?
- Implementación de Text Watcher para EditText
- Agregar automáticamente guión en el número de teléfono en Android
- Android utiliza el observador de texto para evitar escribir caracteres especiales
- Android-Editext cambio después de cada cambio
- Cómo eliminar todos los oyentes agregados con addTextChangedListener
- Formatear el número de teléfono de EditText como tipos de usuario
- ¿Cómo mostrar "No Result" en ListView filtrable?
- Android TextWatcher.afterTextChanged vs TextWatcher.onTextChanged
- Detectar si el contenido de EditText fue modificado por el usuario o por programa?
- Los caracteres de cuenta con TextWatcher fallan en HTC longpress
- Cómo enmascarar un EditText para mostrar el formato de fecha dd / mm / aaaa
- No se puede insertar en Editable
- Android edittext onchange escucha
La documentación de afterTextChanged dice:
Este método se llama para notificarle que, en algún lugar dentro de s, el texto ha sido cambiado. Es legítimo realizar cambios adicionales en s desde esta devolución de llamada, pero tenga cuidado de no meterse en un bucle infinito, ya que cualquier cambio que realice hará que este método se vuelva a llamar de forma recursiva . (No se le dice dónde ocurrió el cambio porque otros métodos afterTextChanged () ya han hecho otros cambios e invalidado los desplazamientos.) Pero si necesita saber aquí, puede usar setSpan(Object, int, int, int)
en onTextChanged(CharSequence, int, int, int)
para marcar su lugar y luego buscar desde aquí, donde terminó el span.
Así pues, con cada s.append("A")
usted call afterTextChanged()
otra vez y así sucesivamente.
Es fácil:
@Override public void afterTextChanged(Editable s) { editText.removeTextChangedListener(this); //Any modifications at this point will not be detected by TextWatcher, //so no more StackOverflowError s.append("A"); editText.addTextChangedListener(this); }
Otra forma de evitar stackoverflow:
TextView textView=new TextView(context); textView.addTextChangedListener(new TextWatcher() { boolean editing=false; @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void beforeTextChanged(CharSequence s, int start, int count,int after) { } @Override public void afterTextChanged(Editable s) { if (!editing){ editing=true; s.append("A"); editing=false; } } });