У меня есть ситуация, когда есть два поля. field1
и field2
. Все, что я хочу сделать, это пусто, field2
когда field1
меняется, и наоборот. Таким образом, в конце только одно поле имеет содержимое.
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("");
}
});
Он отлично работает , если я прилагаю addTextChangedListener
к field1
только, но когда я делаю это для обоих полей приложение падает. Очевидно, потому что они пытаются изменить друг друга на неопределенный срок. Как только field1
изменения, которые он очищает, field2
в этот момент
field2
изменяются, поэтому он очищается field1
и так далее ...
Может кто-нибудь предложить какое-нибудь решение?
starting waiting blocking gc alloc
такому типу ошибок, которые могут даже привести к сбою и зависанию ... так что идите на связывание данных, это безопасно и рекомендовано Google сейчас ..Ответы:
Вы можете добавить флажок, чтобы очистить только тогда, когда текст в поле не является пустым (т. Е. Когда длина отличается от 0).
Документация для
TextWatcher
здесь .Также, пожалуйста, соблюдайте правила именования .
источник
Я знаю, что это старо, но кто-то может когда-нибудь столкнуться с этим снова.
У меня была похожая проблема, когда я вызывал setText для EditText, а onTextChanged вызывался, когда я этого не хотел. Моим первым решением было написать некоторый код после вызова setText (), чтобы отменить ущерб, нанесенный слушателем. Но это было не очень элегантно. Проведя некоторые исследования и тестирование, я обнаружил, что использование getText (). Clear () очищает текст почти так же, как setText (""), но, поскольку он не устанавливает текст, слушатель не вызывается, так что решил мою проблему. Я переключил все мои вызовы setText ("") на getText (). Clear (), и мне больше не нужны повязки, так что, возможно, это тоже решит вашу проблему.
Попробуй это:
источник
Если вы используете Kotlin для разработки Android, вы можете добавить
TextChangedListener()
с помощью этого кода:источник
Немного опоздал с ответом, но вот многоразовое решение:
Таким образом, при использовании вышеуказанного любые
setText()
вызовы, происходящие в TextWatcher, не приведут к повторному вызову TextWatcher:источник
Я также столкнулся с той же проблемой и продолжаю получать
stackOverflow
исключения, и я пришел со следующим решением.первоначально объявлено логическое skipOnChange = false;
источник
Вы также можете использовать метод hasFocus ():
Протестировал это для задания колледжа, над которым я работал, чтобы преобразовать шкалы температур, когда пользователь их вводил. Работало отлично, и это намного проще.
источник
проверьте строку перед тем, как установить другую
EditText
на пустое. еслиField1
пусто, то зачем снова менять на ("")? так что вы можете проверить размер вашей строки с помощью s.lenght () или любого другого решенияДругой способ проверить длину строки:
источник
Я написал собственное расширение для этого, очень полезно для меня. (Котлин)
Вы можете написать только так:
Мое расширение:
источник
в этом коде noteid - это в основном возвращаемые аргументы, которые помещаются в отступ или передаются через отступ.
код на нижней стороне в основном дополнительный код, если вы хотите понять более четко.
новый код активности, названный NoteEditor.java для редактирования, мое приложение - просто приложение заметок.
источник
В Kotlin просто используйте функцию расширения KTX : (он использует
TextWatcher
)импорт
core-KTX
:источник
Мы можем удалить TextWatcher для поля непосредственно перед редактированием его текста, а затем добавить его обратно после редактирования текста.
Объявите наблюдатели текста для field1 и field2 как отдельные переменные, чтобы дать им имя: например, для field1
затем добавьте наблюдателя, используя его имя:
field1.addTextChangedListener(Field_1_Watcher)
для field1 , иfield2.addTextChangedListener(Field_2_Watcher)
для field2Перед сменой поля2 текста удалите TextWatcher:
field2.removeTextChangedListener(Field_2_Watcher)
измените текст:field2.setText("")
затем добавьте обратно TextWatcher:
field2.addTextChangedListener(Field_2_Watcher)
Сделайте то же самое для другого поля
источник
Добавить фон динамически в
onCreate
методе:также удалить фон из XML.
источник