Попробуйте подойти к проблеме издалека;Когда вы смотрите на эту проблему, у вас есть несколько входов (все поля в вашей форме) и один логический выход:
- Все поля в порядке -> Включить кнопку
- Один илибольше полей НЕ в порядке -> отключить кнопку.
Кроме того, у вас есть локальная проверка для каждого поля (для отображения ошибки и т. д.).
Я бы сказал, чтолокальная проверка каждого поля должна выполняться при обратном вызове из текста редактирования (onAfterText и т. д. и т. д.).Вы уже делаете это.
Чтобы обеспечить быструю окончательную проверку (формы в целом), вы можете использовать счетчик ссылок.Например:
Каждый текст редактирования корректируется с помощью afterTextChanged
.Каждый из них выполняет любую проверку, которую вы считаете правильным (может быть общей, если они все одинаковые).
Если проверка не пройдена, вы сохраняете ссылку на поле с ошибкой.
Это будетне имеет побочных эффектов, потому что ничего не происходит, если элемент является или не является в списке.
Это некоторый псевдокод:
// keep a list of fields (this is just a way to do it, there are many others)
var errorFields = MutableHashSet<EditText>
позже в вашей «проверке» (например, afterTextChanges):
if (xxx && yyy && zzz) { //your validations for the individual editText
//setError
myEditText.setError(message)
// Store the reference of the editField in error.
errorFields.add(theEditTextThatHasAFailure).
} else {
myEditText.setError(null)
// If the validation is ok, you remove it:
errorFields.remove(theEditTextThatHasFailure)
}
// The form may have changed, update the global button state.
updateButtonState();
Все, что нужно сделать этому методу, выглядит примерно так:
button.enabled = errorFields.isEmpty()
Это будет пустым, только еслинет никаких полей ошибок.
Это просто идея, которую вам может понадобиться объединить с обратными вызовами для дальнейшего контроля, но помните одно:
EditTexts (или любой другой виджет) есть и долженне отвечать за бизнес-логику, которая движет всей «формой»;это всего лишь отдельные части большой головоломки, и поэтому неправильно давать им ответственность за проверку вашей Формы;однако они могут (и должны) проверять себя и обрабатывать свое собственное состояние ошибки (как вы делаете), но это все, что нужно.
Они могут информировать об изменении состояния (например, черезслушатель onAfterText, или после получения / потери фокуса и т. д.), но не должен принимать решения бизнес-логики.EditTexts предназначены для того, чтобы принимать пользовательский ввод и отображать его на экране, вот и все.
И последнее, но не менее важное: не забывайте удалять ссылки при уничтожении ваших представлений
onDestroy() {
errorFields.clear()
}