我想在表单中的所有字段都填写完后启用AppCompatButton。
我正在使用ViewModel,并希望使用数据绑定来启用此功能。
我有2种方法,当在视图上更改文本以更新视图模型中的对象数据时会触发。
我遇到的问题是两个字段都填写完后,我需要启用布局上的按钮以允许它们继续进行。
一个例子是登录,当填写用户名和密码字段时,启用登录按钮。
您可以使用相同的解决方案,例如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}"
... />
...
为此,您必须在您的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/
您可以根据EditText直接在XML中设置按钮状态。查看方式-
android:enabled="@{etName.text.length() > 0 && etPassword.text.length() > 0}"
etName
和etPassword
是名称和密码EditText的ID。
完整示例XML-
<LinearLayout
>
<EditText
android:id="@+id/etName"
/>
<EditText
android:id="@+id/etPassword"
/>
<Button
android:enabled="@{etName.text.length() > 0 && etPassword.text.length() > 0}"
/>
</LinearLayout>