Using one-way data binding, you can set a value on an attribute and set a listener that reacts to a change in that attribute:
<CheckBox android:id="@+id/rememberMeCheckBox" android:checked="@{viewmodel.rememberMe}" android:onCheckedChanged="@{viewmodel.rememberMeChanged}" />
Two-way data binding provides a shortcut to this process:
<CheckBox android:id="@+id/rememberMeCheckBox" android:checked="@={viewmodel.rememberMe}" />
The @={} notation, which importantly includes the "=" sign, receives data
changes to the property and listen to user updates at the same time.
In order to react to changes in the backing data, you can make your layout
variable an implementation of Observable, usually
BaseObservable, and use a
@Bindable annotation, as shown in
the following code snippet:
Kotlin
class LoginViewModel : BaseObservable { // val data = ... @Bindable fun getRememberMe(): Boolean { return data.rememberMe } fun setRememberMe(value: Boolean) { // Avoids infinite loops. if (data.rememberMe != value) { data.rememberMe = value // React to the change. saveData() // Notify observers of a new value. notifyPropertyChanged(BR.remember_me) } } }
Java
public class LoginViewModel extends BaseObservable { // private Model data = ... @Bindable public Boolean getRememberMe() { return data.rememberMe; } public void setRememberMe(Boolean value) { // Avoids infinite loops. if (data.rememberMe != value) { data.rememberMe = value; // React to the change. saveData(); // Notify observers of a new value. notifyPropertyChanged(BR.remember_me); } } }
Because the bindable property's getter method is called getRememberMe(), the
property's corresponding setter method automatically uses the name
setRememberMe().
For more information on using BaseObservable and @Bindable, see Work with
observable data objects.
Two-way data binding using custom attributes
The platform provides two-way data binding implementations for the most common
two-way attributes and change listeners, which you can use
as part of your app. If you want to use two-way data binding with custom
attributes, you need to work with the
@InverseBindingAdapter
and
@InverseBindingMethod
annotations.
For example, if you want to enable two-way data binding on a "time" attribute
in a custom view called MyView, complete the following steps:
Annotate the method that sets the initial value and updates when the value changes using
@BindingAdapter:Kotlin
@BindingAdapter("time") @JvmStatic fun setTime(view: MyView, newValue: Time) { // Important to break potential infinite loops.