Tengo una situación, donde hay dos campos. field1
y field2
. Todo lo que quiero hacer está vacío field2
cuando field1
se cambia y viceversa. Entonces, al final, solo un campo tiene contenido.
field1 = (EditText)findViewById(R.id.field1);
field2 = (EditText)findViewById(R.id.field2);
field1.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {}
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
public void onTextChanged(CharSequence s, int start,
int before, int count) {
field2.setText("");
}
});
field2.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {}
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
public void onTextChanged(CharSequence s, int start,
int before, int count) {
field1.setText("");
}
});
Funciona bien si hay que adjuntar addTextChangedListener
a la field1
única, pero cuando lo hago por los dos campos de la aplicación se bloquea. Obviamente porque intentan cambiarse indefinidamente. Una vez que los field1
cambios se borran field2
en este momento,
field2
se cambian para que se borren field1
y así sucesivamente ...
¿Alguien puede sugerir alguna solución?
starting waiting blocking gc alloc
este tipo de error, que incluso puede provocar un bloqueo y bloqueo ... así que vaya por el enlace de datos, eso es seguro y recomendado por google ahora ..Respuestas:
Puede agregar un cheque para borrar solo cuando el texto en el campo no está vacío (es decir, cuando la longitud es diferente de 0).
Documentación para
TextWatcher
aquí .También respete las convenciones de nomenclatura .
fuente
Sé que esto es viejo, pero alguien podría volver a encontrarlo algún día.
Tuve un problema similar en el que llamaría a setText en EditText y onTextChanged se llamaría cuando no lo quisiera. Mi primera solución fue escribir un código después de llamar a setText () para deshacer el daño hecho por el oyente. Pero eso no fue muy elegante. Después de investigar y probar, descubrí que el uso de getText (). Clear () borra el texto de la misma manera que setText (""), pero como no está configurando el texto, no se llama al oyente, de modo que resuelto mi problema Cambié todas mis llamadas de setText ("") a getText (). Clear () y ya no necesitaba las vendas, así que quizás eso también resuelva su problema.
Prueba esto:
fuente
Si está utilizando Kotlin para el desarrollo de Android, puede agregar
TextChangedListener()
usando este código:fuente
Un poco tarde de una respuesta, pero aquí hay una solución reutilizable:
Entonces, cuando se usa lo anterior, cualquier
setText()
llamada que ocurra dentro del TextWatcher no dará como resultado que se vuelva a llamar al TextWatcher:fuente
También me he enfrentado al mismo problema y sigo recibiendo
stackOverflow
excepciones, y vengo con la siguiente solución.declarado inicialmente booleano skipOnChange = false;
fuente
También puede usar el método hasFocus ():
Probé esto para una tarea universitaria en la que estaba trabajando para convertir escalas de temperatura a medida que el usuario las ingresaba. Funcionó perfectamente, y es mucho más simple.
fuente
marque String antes de configurar otro
EditText
para vaciarlo. siField1
está vacío, ¿por qué necesita cambiar nuevamente a ("")? para que pueda verificar el tamaño de su cadena con s.lenght () o cualquier otra soluciónOtra forma de comprobar la longitud de String es:
fuente
Escribí mi propia extensión para esto, muy útil para mí. (Kotlin)
Solo puedes escribir así:
Mi extensión:
fuente
en este código, noteid es básicamente argumentos retirados que se introducen en la sangría o se pasan a través de la sangría.
El código en el lado negativo es básicamente el código adicional, si desea comprender más claramente.
nuevo código de actividad llamado NoteEditor.java para fines de edición, mi aplicación es básicamente la aplicación de notas.
fuente
En Kotlin simplemente use la función de extensión KTX : (Utiliza
TextWatcher
)importación
core-KTX
:fuente
Podemos eliminar TextWatcher para un campo justo antes de editar su texto y luego agregarlo nuevamente después de editar el texto.
Declare Text Watchers para field1 y field2 como variables separadas para darles un nombre: por ejemplo, para field1
a continuación, añadir el observador usando su nombre:
field1.addTextChangedListener(Field_1_Watcher)
para campo1 , yfield2.addTextChangedListener(Field_2_Watcher)
para campo2Antes de cambiar el texto del campo2, elimine el TextWatcher:
field2.removeTextChangedListener(Field_2_Watcher)
cambie el texto:field2.setText("")
luego agregue el TextWatcher de nuevo:
field2.addTextChangedListener(Field_2_Watcher)
Haz lo mismo para el otro campo
fuente
Agregar fondo dinámicamente en el
onCreate
método:También elimine el fondo de XML.
fuente