当所有EditText完成时启用按钮

问题描述 投票:1回答:3

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

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

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

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

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

android android-databinding android-viewmodel
3个回答
3
投票

您可以使用相同的解决方案,例如here

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

并且在您的活动课中,听您的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
      })
    }
}

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

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

0
投票

为此,您必须在您的editText中添加onEditorActionListener,然后才能启用该按钮。例如,我有一个名为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/


0
投票

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>

© www.soinside.com 2019 - 2024. All rights reserved.