当所有 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
中使用您的 LiveData
s':
...
//Add your ViewModel class to layout here
<EditText
...
android:text="@={vm.mLoginLiveData}"
... />
...
<EditText
...
android:text="@={vm.mPasswordLiveData}"
... />
...
我想在表单中的所有字段都完成后启用 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
中使用您的 LiveData
s':
...
//Add your ViewModel class to layout here
<EditText
...
android:text="@={vm.mLoginLiveData}"
... />
...
<EditText
...
android:text="@={vm.mPasswordLiveData}"
... />
...