当所有 EditText 完成时启用按钮

Enable a button when all EditText complete

我想在表单中的所有字段都完成后启用 AppCompatButton。

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

我有 2 个方法在视图上更改文本以更新视图模型中的对象数据时触发。

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

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

要做到这一点,您必须将 onEditorActionListener 添加到您的 editText 中,您将启用按钮让我们说,例如我有一个名为 password 的编辑文本,我想在它不为空时启用登录按钮,当输入的文本不少于 8 我会验证并启用这样的按钮:

password.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) {
        if (password.getText().length() > 0  && password.getText.lenght !< 8) {
            //Automatically click button to login
            loginBtn.setEnabled(true);
            return true;
        }
        return false;
    }
});

您还可以在 EditText 上使用 TextWatcher 或 addTextChangedListener,详情请参见此处: https://freakycoder.com/android-notes-66-how-to-use-textwatcher-for-more-than-one-edittext-e190b7ae1070

https://www.dev2qa.com/android-enable-disable-button-by-edittext-text-length/

您可以使用与

相同的解决方案

但是如果您只想使用 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)
    }
}

在你的 activity class 听你的 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
      })
    }
}

并且不要忘记在 'your_activity_layout'.xml 中使用您的 LiveDatas':

...
//Add your ViewModel class to layout here
<EditText
  ...
  android:text="@={vm.mLoginLiveData}"
  ... />
...
<EditText
  ...
  android:text="@={vm.mPasswordLiveData}"
  ... />
...