Включить кнопку, когда все EditText завершены - PullRequest
0 голосов
/ 30 января 2019

Я хотел бы включить AppCompatButton, когда все поля в форме заполнены.

Я использую ViewModel и хотел бы использовать привязку данных для включения этого.

У меня есть 2 методаэто срабатывает при изменении текста в представлениях для обновления данных объектов в модели представления.

Проблема, с которой я сталкиваюсь, заключается в том, что, когда оба поля заполнены, мне нужно включить кнопку на макете, позволяющую им продолжить.

Примером может быть вход в систему, когда поля имени пользователя и пароля заполнены, кнопка входа становится активной.

Ответы [ 3 ]

0 голосов
/ 30 января 2019

Вы можете использовать то же решение, что и здесь

Но если вы хотите использовать только 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 = ...
  }
}

и в вашем классе деятельности слушайте ваши 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 s 'в 'your_activity_layout'.xml:

...
//Add your ViewModel class to layout here
<EditText
  ...
  android:text="@={vm.mLoginLiveData}"
  ... />
...
<EditText
  ...
  android:text="@={vm.mPasswordLiveData}"
  ... />
...
0 голосов
/ 05 февраля 2019

1 Line Solution

Вы можете напрямую установить состояние кнопки в 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>

0 голосов
/ 30 января 2019

Чтобы сделать это, вам нужно добавить 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/

...