Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Enable a button when all EditText complete

I would like to enable a AppCompatButton when all fields in a form are complete.

I am using a ViewModel and would like to use Databinding to enable this.

I have 2 methods that fire when text is changed on the views to update an objects data in the viewmodel.

The issue I am running into is when both fields are complete, I need to enable a button on the layout allowing them to proceed.

An example would be log in, when the username and password fields are fulled in, the log in button becomes enabled.

like image 245
Stillie Avatar asked Jan 26 '23 19:01

Stillie


1 Answers

You can use the same solution like here

But if you want use only AndroidArch and DataBinding you can create your own approach like below:

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)
    }
}

and in your activity class listen your 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
      })
    }
}

And didn't forget to use your LiveDatas' in 'your_activity_layout'.xml:

...
//Add your ViewModel class to layout here
<EditText
  ...
  android:text="@={vm.mLoginLiveData}"
  ... />
...
<EditText
  ...
  android:text="@={vm.mPasswordLiveData}"
  ... />
...
like image 64
aLT Avatar answered Jan 31 '23 19:01

aLT