kotlin:如何获取EditText是否启用了setError?

时间:2019-06-07 11:51:34

标签: android kotlin

如何验证EditText是否启用了setError?

如果EditText出错,我想禁用按钮。

通过其他任何方式来实现这一目标。

当我将view.calcbutton.setEnabled(false)放入validateEditText函数中时,它有点用,但是我使用validateEditText函数来验证多个EditText,并且只有最后一个函数调用禁用该按钮。 如果第一个功能调用禁用了该按钮,则第二个功能调用再次启用了该按钮,反之亦然。

但是我想在此功能之外执行此操作,因为如果多个EditText之一具有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 :(得分:0)

您可以创建一个回调,以在设置错误或删除错误时进行通知。

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
}

答案 1 :(得分:0)

尝试从更远的地方解决问题;当您查看此问题时,您有多个输入(表单中的所有字段)和一个布尔输出:

  1. 所有字段均正常->启用按钮
  2. 一个或多个字段不正确->禁用按钮。

此外,您在每个字段上都有本地验证(以显示错误等)。

我认为每个字段的本地验证都应在编辑文本(onAfterText等)的回调中完成。您已经在执行此操作。

要确保最终验证(作为整个表单)的速度很快,可以使用引用计数器。例如:

每个编辑文本均以afterTextChanged进行验证。每个人都会执行您认为正确的验证(如果相同,则可以是共享验证)。

如果验证失败,则保留对失败字段的引用。

这不会产生副作用,因为无论列表上的项目is还是is not都不会发生。

这是一些伪代码:

// 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()
}