android - 使用 rxJava 进行表单验证是否有意义
问题描述
我的 Android 应用程序中有一个屏幕,其中有几个输入字段需要验证,然后才能使用“保存”按钮。保存按钮始终处于启用状态,但如果任何输入字段没有任何有效数据,则不会执行任何操作。
我能想到两种方法。一种是在每个字段失去焦点时验证每个字段的传统方法,然后设置一个成员标志来指示该字段是好还是坏。保存按钮将检查所有字段上的标志,如果其中任何一个指示无效,则忽略单击事件。
另一种方法是使用 rxJava 并在字段失去焦点时以某种方式将输入字段中的文本输入到流中。我不清楚如何用多个字段实现这种方法。rxJava 方法是否有意义?还是矫枉过正?
解决方案
是的,这可能是一个很好的变体。您可以为每个 EditText 拥有自己的验证器。喜欢:
interface InputValidator : TextWatcher {
fun isValid(): Boolean
}
使用默认的可能实现:
class SimpleInputValidator(private val threshold: Int = 1) : InputValidator {
private var isValid = false
override fun isValid(): Boolean {
return isValid
}
override fun afterTextChanged(s: Editable?) {
isValid = s?.length?: 0 > threshold
}
override fun beforeTextChanged(
s: CharSequence?,
start: Int,
count: Int,
after: Int
) { }
override fun onTextChanged(
s: CharSequence?,
start: Int,
before: Int,
count: Int
) { }
}
并在您的片段/活动中使用 Jake Wharton 的 rxbinding3 库:
class MyFragment : Fragment() {
private val editText1: EditText
private val editText2: EditText
private val validator1: InputValidator = SimpleInputValidator(10)
private val validator2: InputValidator = SimpleInputValidator(20)
private var isMainButtonValid = false
override fun onViewCreated(
view: View,
savedInstanceState: Bundle?
) {
editText1.addTextChangedListener(validator1)
editText2.addTextChangedListener(validator2)
editText1.afterTextChangeEvents().subcribe {
validateMainButton()
}
editText2.afterTextChangeEvents().subcribe {
validateMainButton()
}
}
private fun validateMainButton() {
isMainButtonValid = validator1.isValid() && validator2.isValid()
}
}
推荐阅读
- laravel - 当我将数据提交到文本字段时,它没有提交
- apache-spark - 'date_sub' 未定义
- c# - 等待打开文件对话框在 Selenium 中打开
- google-cloud-dataflow - Apache Beam / Google Cloud Dataflow 大查询阅读器第二次运行失败
- openstack - 在openstack中创建单个ip的网络
- istio - 配置 istio 目标规则以使用后备 URL 而不是 503
- ruby-on-rails - 使用多个基于主机的路由约束时出现 Rails link_to 问题
- javascript - 使用 Auth Headers 发送 axios get 请求时出现 401 错误
- python - YouTube API v3 - Python - 如何批量插入 playlistItems
- verilog - 带有二进制数的 For 循环