Включить кнопку, когда все 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 &amp;&amp; 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 &amp;&amp; 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/

Другие вопросы по тегам