기존의 DataBinding은 일방적으로 변수의 값을 View에 적용하는 것이였습니다. View의 값을 DataBinding 변수에 적용하며 View에 변수의 값을 적용하는 방법도 존재합니다.
DataBinding 변수를 View에 적용시키며 변화하는 View의 값을 DataBinding변수에 적용하는 것을 two-way data binding이라고 합니다. 기존에는 DataBinding을 사용하면서 변하는 View의 값을 변수에 반영하기 위해서는 아래와 같이 값이 변할 때 동작을 정의한 method를 같이 설정해 주어야 했습니다.
<!-- one-way data binding -->
<CheckBox
android:id="@+id/rememberMeCheckBox"
android:checked="@{viewmodel.rememberMe}"
android:onCheckedChanged="@{viewmodel.rememberMeChanged}"
/>
Binding expression을 기존과 약간 다르게 @={}
를 사용하여 two-way data binding을 적용할 수 있습니다.
<!-- two-way data binding -->
<CheckBox
android:id="@+id/rememberMeCheckBox"
android:checked="@={viewmodel.rememberMe}"
/>
위와 같이 설정하게 되면 binding class를 생성시 자동으로 InverseBindingListener를 생성하여 View의 값이 변경될 때 자동으로 변수에 반영해주게 됩니다.
private androidx.databinding.InverseBindingListener mboundView1androidTextAttrChanged = new androidx.databinding.InverseBindingListener() {
@Override
public void onChange() {
// Inverse of post.title
// is post.setTitle((java.lang.String) callbackArg_0)
java.lang.String callbackArg_0 = androidx.databinding.adapters.TextViewBindingAdapter.getTextString(mboundView1);
// localize variables for thread safety
// post.title
java.lang.String postTitle = null;
// post
com.example.architectureexample.data.models.post.Post post = mPost;
// post != null
boolean postJavaLangObjectNull = false;
postJavaLangObjectNull = (post) != (null);
if (postJavaLangObjectNull) {
post.setTitle(((java.lang.String) (callbackArg_0)));
}
}
};
[1] "Two-way data binding," Android Developers, last modified Oct 28, 2021, accessed May 25, 2022, https://developer.android.com/topic/libraries/data-binding/two-way.