首页 > 解决方案 > 使用 rxJava 进行表单验证是否有意义

问题描述

我的 Android 应用程序中有一个屏幕,其中有几个输入字段需要验证,然后才能使用“保存”按钮。保存按钮始终处于启用状态,但如果任何输入字段没有任何有效数据,则不会执行任何操作。

我能想到两种方法。一种是在每个字段失去焦点时验证每个字段的传统方法,然后设置一个成员标志来指示该字段是好还是坏。保存按钮将检查所有字段上的标志,如果其中任何一个指示无效,则忽略单击事件。

另一种方法是使用 rxJava 并在字段失去焦点时以某种方式将输入字段中的文本输入到流中。我不清楚如何用多个字段实现这种方法。rxJava 方法是否有意义?还是矫枉过正?

标签: androidrx-java2

解决方案


是的,这可能是一个很好的变体。您可以为每个 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()
  }
}

推荐阅读