当所有 EditText 完成时启用按钮

x10*_*ion 4 android android-databinding android-viewmodel

当表单中的所有字段都完成时,我想启用 AppCompatButton。

我正在使用 ViewModel 并希望使用数据绑定来启用它。

当视图上的文本更改以更新视图模型中的对象数据时,我有两种方法会触发。

我遇到的问题是当两个字段都完成时,我需要在布局上启用一个按钮以允许它们继续。

一个例子是登录,当用户名和密码字段填满时,登录按钮变为启用。

小智 8

您可以使用与此处相同的解决方案

但是,如果您只想使用 AndroidArch 和 DataBinding,您可以创建自己的方法,如下所示:

class MyVM : ViewModel() {
    ...
    val mLoginLiveData = MutableLiveData<String>()
    val mPasswordLiveData = MutableLiveData<String>()
    val mLoginPasswordMediator = MediatorLiveData<Boolean>()
    ...
    init {
      mLoginPasswordMediator.addSource(mLoginLiveData) { validateForm() }
      mLoginPasswordMediator.addSource(mPasswordLiveData) { validateForm() }
      ...
    }

    private fun validateForm() {
        // put your validation logic here, and update the following value
        // as `true` or `false` based on validation result
        // mLoginPasswordMediator.value = ...
    }

    override fun onCleared() {
        // DO NOT forget to remove sources from mediator
        mLoginPasswordMediator.removeSource(mLoginLiveData)
        mLoginPasswordMediator.removeSource(mPasswordLiveData)
    }
}
Run Code Online (Sandbox Code Playgroud)

在你的活动课上听你的MediatorLiveData

class MyActivity : AppCompatActivity() {
    ...
    override fun onCreate(savedInstanceState: Bundle?) {
      //Obtain your ViewModel class here
      //Initialize binding here
      ...
      mBinding.lifecycleOwner = this
      mVM.mLoginPasswordMediator.observe(this, Observer { validationResult ->
          mBinding.yourButton.isEnabled = validationResult
      })
    }
}
Run Code Online (Sandbox Code Playgroud)

并且不要忘记使用您的LiveDatas' in 'your_activity_layout'.xml

...
//Add your ViewModel class to layout here
<EditText
  ...
  android:text="@={vm.mLoginLiveData}"
  ... />
...
<EditText
  ...
  android:text="@={vm.mPasswordLiveData}"
  ... />
...
Run Code Online (Sandbox Code Playgroud)