如何验证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
}
}
答案 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)
尝试从更远的地方解决问题;当您查看此问题时,您有多个输入(表单中的所有字段)和一个布尔输出:
此外,您在每个字段上都有本地验证(以显示错误等)。
我认为每个字段的本地验证都应在编辑文本(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()
}