#java #android #boolean #logic
Вопрос:
Я работаю над проблемой, когда запись в моем приложении имеет три разных состояния (представленных логическими значениями): isNew
, exists
, и isDirty
. isNew
указывает, является ли запись новой записью или нет. exists
указывает, существует ли эта конкретная запись в базе данных или нет. isDirty
указывает, изменилось ли какое-либо из значений в записи. Идея состоит в том, чтобы проверить эти состояния и выдать предупреждение о том, что запись не была сохранена, если они попытаются вернуться.
Я использую a TextChangedListener
для мониторинга полей.
Когда пользователь впервые открывает страницу, на ней отображается самая последняя запись, для которой установлены isNew
значения false и exists
true. При создании новой записи isNew
устанавливается значение true (и exists
становится ложным). Как только будут введены новые значения, isDirty
они станут истинными. Сохранение наборов записей isNew
в значения false и exists
true.
Теперь, когда пользователь пытается выйти без сохранения, должно появиться предупреждение. Логика предупреждения должна быть примерно такой: неизмененная новая запись не должна вызывать предупреждения. Неизмененная существующая запись не должна вызывать предупреждения. Должна появиться измененная новая и измененная существующая запись.
Проблема, с которой я сталкиваюсь, заключается в том, как установить состояния (логические значения) внутри прослушивателя TextChanged. Прямо сейчас прослушиватель TextChanged запускается при загрузке страницы, а также при изменении любого из полей, в том числе при создании новой записи. Что означает, что isDirty
это, по сути, всегда верно. Что затем делает его бесполезным для использования в качестве проверки при выходе.
Я пробовал использовать
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
if (isNew || exists) {
isDirty = false;
}
}
И это работает, чтобы не устанавливать isDirty = true
время загрузки, но любые последующие изменения поля также возвращают тот же результат. Что все равно делает его бесполезным.
правильно ли использовать TextChangedListener
правильный путь? Или есть какие-то другие средства, с помощью которых я могу проверить, изменился ли текст, не вызывая TextChangedListener
загрузку? Возможно, есть способ НЕ вызывать прослушивателя при загрузке страницы или создании новой записи?
Комментарии:
1. Кажется, я все понял. В итоге я использовал
public void afterTextChanged(Editable s) { if (s.toString().equals("") amp;amp; isNew) { isDirty = false; } else { isDirty = true; }}
2. Являются ли какие-либо из этих трех значений статуса взаимоисключающими?
Ответ №1:
В итоге я использовал
public void afterTextChanged(Editable s) { if (s.toString().equals("") amp;amp; isNew) { isDirty = false; } else { isDirty = true; }}
Отлично работает!