kotlin: Как получить, если в EditText включена функция setError? - PullRequest
0 голосов
/ 07 июня 2019

Как я могу проверить, есть ли в EditText setError?

Я хочу отключить кнопку, если EditText имеет ошибку.

Любой другой способ добиться этого.

Это работает, когда я помещаю view.calcbutton.setEnabled(false) в функцию validateEditText, но я использую функцию validateEditText для проверки нескольких EditTexts, и только последний вызов функции отключает кнопку. если первый вызов функции отключает кнопку, второй включает ее снова, и наоборот.

Но я хочу сделать это вне этой функции, потому что если один из нескольких EditTexts имеет setError, кнопка должна быть отключена.

//global var blockcalcbutton
var blockcalcbutton = 0

//function to validate EditTexts and set blockcalcbutton=1 if setError
validateEditText(view.input_volt, view, getString(R.string.invalid_volt))

        if(blockcalcbutton == 1) {
            view.calcbutton.setEnabled(false)
            view.calcbutton.setText(getString(R.string.calcbutton_disabled))
            view.calcbutton.setBackgroundResource(R.color.buttonDisabled)
        } else {
            view.calcbutton.setEnabled(true)
            view.calcbutton.setText(getString(R.string.calcbutton_enabled))
            view.calcbutton.setBackgroundResource(R.color.buttonBackground)
        }
fun validateEditText(editText: EditText, message: String) {
        val myEditText = editText
        myEditText.addTextChangedListener(object: TextWatcher {
            override fun afterTextChanged(s: Editable?) {

                if(myEditText.text.toString() == "" || myEditText.text.toString() == "." || myEditText.text.toString() == "0") {
                    //setError
                    myEditText.setError(message)
                    //var to disable Button 
                    blockcalcbutton = 1
                } else {
                    //delete setError
                    myEditText.setError(null)
                    //var to enable Button
                    blockcalcbutton = 0
                }
            }

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Попробуйте подойти к проблеме издалека;Когда вы смотрите на эту проблему, у вас есть несколько входов (все поля в вашей форме) и один логический выход:

  1. Все поля в порядке -> Включить кнопку
  2. Один илибольше полей НЕ в порядке -> отключить кнопку.

Кроме того, у вас есть локальная проверка для каждого поля (для отображения ошибки и т. д.).

Я бы сказал, чтолокальная проверка каждого поля должна выполняться при обратном вызове из текста редактирования (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()
}
0 голосов
/ 07 июня 2019

Вы можете создать обратный вызов, чтобы уведомлять, когда вы устанавливаете или удаляете ошибку.

interface EditTextErrorListener {
    fun onErrorSet()
    fun onErrorDeleted()
}

Здесь вы можете уведомить:

if(myEditText.text.toString() == "" || myEditText.text.toString() == "." || myEditText.text.toString() == "0") {
    //setError
    myEditText.setError(message)
  --->  listener.onErrorSet()
    //var to disable Button 
    blockcalcbutton = 1
} else {
    //delete setError
    myEditText.setError(null)
  --->  listener.onErrorDeleted()
    //var to enable Button
    blockcalcbutton = 0
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...