当所有EditText完成时启用按钮

时间:2019-01-30 09:38:50

标签: android android-databinding android-viewmodel

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

我正在使用ViewModel,并希望使用数据绑定来启用此功能。

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

我遇到的问题是两个字段都填写完后,我需要启用布局上的按钮以允许它们继续进行。

例如登录,当填写用户名和密码字段时,“登录”按钮变为启用状态。

3 个答案:

答案 0 :(得分:2)

您可以使用与here

相同的解决方案

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

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

,然后在您的活动课堂中听您的MediatorLiveData

class MyActivity : AppCompatActivity() {
  ...
  override fun onCreate(savedInstanceState: Bundle?) {
    //Obtain your ViewModel class here
    //Initialize binding here
    ...
    mBinding.setLifecycleOwner(this)
    mVM.mLoginPasswordMediator.observe(this, Observer {
      if (!mVM.mLoginLiveData.value.isNullOrEmpty() && !mVM.mPasswordLiveData.value.isNullOrEmpty()) {
        //Enable your button here
    }) else {
        //Disable your button here
      }
  }
}

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

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

答案 1 :(得分:1)

1行解决方案

您可以直接根据EditText在XML中设置按钮状态。了解如何-

android:enabled="@{etName.text.length() > 0 &amp;&amp; etPassword.text.length() > 0}"

etNameetPassword是名称和密码EditText的ID。

完整的示例XML-

<LinearLayout
    >

    <EditText
        android:id="@+id/etName"
        />

    <EditText
        android:id="@+id/etPassword"
        />

    <Button
        android:enabled="@{etName.text.length() > 0 &amp;&amp; etPassword.text.length() > 0}"
        />

</LinearLayout>

答案 2 :(得分:0)

要执行此操作,您必须将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/