Включить кнопку, когда все EditText завершены
Я хотел бы включить AppCompatButton, когда все поля в форме заполнены.
Я использую ViewModel и хотел бы использовать привязку данных, чтобы включить это.
У меня есть 2 метода, которые запускаются при изменении текста в представлениях для обновления данных объектов в модели представления.
Проблема, с которой я сталкиваюсь, заключается в том, что, когда оба поля заполнены, мне нужно включить кнопку на макете, позволяющую им продолжить.
Примером может быть вход в систему, когда поля имени пользователя и пароля заполнены, кнопка входа становится активной.
3 ответа
Вы можете использовать то же решение, что и здесь
Но если вы хотите использовать только 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 линия Решение
Вы можете напрямую установить состояние кнопки в XML в зависимости от EditText. Смотри как -
android:enabled="@{etName.text.length() > 0 && etPassword.text.length() > 0}"
Вот etName
& etPassword
Идентификаторы имени и пароля EditText.
Полный образец XML -
<LinearLayout
>
<EditText
android:id="@+id/etName"
/>
<EditText
android:id="@+id/etPassword"
/>
<Button
android:enabled="@{etName.text.length() > 0 && etPassword.text.length() > 0}"
/>
</LinearLayout>
Чтобы сделать это, вам нужно добавить 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;
}
});
Вы также можете использовать TextWatcher или addTextChangedListener в EditText, см. Здесь для получения более подробной информации: 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/