我想在表单中的所有字段都填写完毕后启用AppCompatButton。
我正在使用ViewModel,并希望使用数据绑定来启用此功能。
当在视图上更改文本以更新视图模型中的对象数据时,我有两种方法会触发。
我遇到的问题是两个字段都填写完后,我需要启用布局上的按钮以允许它们继续进行。
例如登录,当填写用户名和密码字段时,“登录”按钮变为启用状态。
答案 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)
您可以直接根据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>
答案 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/