[Android] DataBinding의 동작방식 - 6. InverseBinding (InverseBindingAdapter) + Two way Binding

이미지
그동안은 단방향 바인딩(One-way Binding)에 대해서만 알아봤다. 즉, 내가 어떤 Model을 XML로 넣어주면(setModel()) XML상에 정의한 규칙에 따라, Model의 정보들을 View에 넣어주는 것이었다. 하지만 반대로 View의 정보를 얻고 싶은 경우가 분명 생긴다.그것도 View의 값이 변경되는 시점에 말이다.
 어쩌면 아직 감이 오지 않을수도 있고, 여기까지 왔다는 것은 InverseBinding의 존재를 알고 검색하다가 온 것일 수도 있다. 어찌되었건 InverseBinding은 생각보다 간단하고 더불어 Two-Way Binding까지 함께 살펴보자.


"[Android] DataBinding의 동작방식" 전체목록
1. Setter Method와의 연결
2. BindingAdapter의 기본 및 사용 시점
3. BindingAdapter의 사용시 팁
4. include Tag 혹은 ViewStub 사용시의 Binding
5. Listener, Callback
6. InverseBinding (InverseBindingAdapter) + Two way Binding

1. InverseBinding?  Data Setting 관점에서 Binding이 Model To View 였다면, InverseBinding은 View To Model이다. InverseBinding은 사실 이것이 전부이다.
 언제 쓰는지 궁금할 수도 있다. 하나의 예를 들어보면 ViewPager와 Page Indicator의 관계를 들 수 있다. 아래의 그림을 보자.


위의 화면은 5개의 Page를 갖는 ViewPager와 현재 Page가 어디인지를 알려주는 Page Indicator로 구성되어있다. 그리고 이 Page Indicator는 ViewPager로부터 현재 페이지가 어디인지 받을 수 있어야 하며, 그를 위해 ViewPager에 OnPageChangeListener를 등록해서 처리할 수 있다. Flow를 보면 아래 그림과 같다.



 하지만 이젠 이것도 귀…

[Android] DataBinding의 동작방식 - 5. Listener, Callback (CustomView의 Callback을 람다식으로 Binding하기)

DataBinding을 이용하면서 마음에 들었던 것중 하나는 Listener, Callback이다. 특히 람다식으로 Callback 등록하는 부분은 코드의 가독성까지 올려주기도 해서 개인적으론 참 좋아하며 자주 사용한다.
 하지만, 이와 관련해서 자세한 내용이 Developer Page에 나와있지 않기 때문에, 몇가지 팁들을 아래에 정리해본다. 작성의 편의를 위해 Callback, Listener를 모두 Callback이라고 작성한다.

"[Android] DataBinding의 동작방식" 전체목록
1. Setter Method와의 연결
2. BindingAdapter의 기본 및 사용 시점
3. BindingAdapter의 사용시 팁
4. include Tag 혹은 ViewStub 사용시의 Binding
5. Listener, Callback
6. InverseBinding (InverseBindingAdapter) + Two way Binding


1. Callback 등록 방법  이건 Developer Page의 내용에도 나와있긴 하지만 한번 짚고 넘어가려한다. Callback을 등록하는 방법은 아래 두가지이다. android:onClick 부분을 비교해보자.

  - Setter Method 연결방식 : 직접 Callback 객체를 등록하는 방법
<?xml version="1.0" encoding="utf-8"?><layoutxmlns:android="http://schemas.android.com/apk/res/android"><data><variablename="handlers"type="com.example.Handlers"/><variablename="user"type="com.example.User"/></data><LinearLayoutandroid:or…

[Android] DataBinding의 동작방식 - 4. include Tag 혹은 ViewStub 사용시의 Binding

이미지
이번에는 <include>와 ViewStub 사용시의 Binding에 대해서 알아보려고 한다. 사실 include와 ViewStub까지 사용해서 앱을 만드는 경우는 그렇게 많지는 않다고 생각한다. 하지만 앱이 복잡해 지는경우, View의 재사용을 include를 통해 적용하게 되는 경우등에는 쓰는 경우들이 있는데, Binding을 사용하는 경우에는 Bind되는 Model을 재사용하거나 분리하려고 할 때도 쓸 수 있다.

"[Android] DataBinding의 동작방식" 전체목록
1. Setter Method와의 연결
2. BindingAdapter의 기본 및 사용 시점
3. BindingAdapter의 사용시 팁
4. include Tag 혹은 ViewStub 사용시의 Binding
5. Listener, Callback
6. InverseBinding (InverseBindingAdapter) + Two way Binding

1. <include>에서의 Binding  우선은 제일 간단한 <include> Tag 사용시의 Binding에 대해서 알아본다. 가장 외곽
 1) outer layout xml
<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"><data><variable name="user" type="com.example.User"/></data><LinearLayout android:layout_width="match_parent"android:…

[Android] DataBinding의 동작방식 - 3. BindingAdapter의 사용시 팁

이번에는 지난번에 이야기 했던 BindingAdapter의 사용시 팁들에 대해서 정리해보려고 한다.

"[Android] DataBinding의 동작방식" 전체목록
1. Setter Method와의 연결
2. BindingAdapter의 기본 및 사용 시점
3. BindingAdapter의 사용시 팁
4. include Tag 혹은 ViewStub 사용시의 Binding
5. Listener, Callback
6. InverseBinding (InverseBindingAdapter) + Two way Binding

1. BindingAdapter의 Overloading   Overloading라 하면, Method 이름은 같은데 들어가는 Parameter들이 조금씩 다른 경우들인데, BindingAdapter도 비슷한 사용방법이 있다. 안타깝게도 Dev 페이지의 문서에는 설명이 되어있지 않아서 몇가지 예를 들어가며 설명을 해보려 한다.


@BindingAdapter("loadImage") publicstaticvoid loadImage(ImageView view, String path) { GlideApp.with(view.getContext()) .load(path) .into(view); }
위의 코드는 ImageView에 Image Path를 넣어서 load하도록 하는 BindingAdapter이다. 위의 BindingAdapter만 정의하면, XML 상에서 [
app:loadImage="@{imagePath}" ]와 같은 형태로 Image Load를 할 수 있다.
 하지만 개발을 진행하다보면, 꼭 String 형태의 path뿐 아니라 Uri라던가 혹은 integer형의 Resource ID로 Load를 하고 싶을 경우들이 생기기 마련이다. 그런 경우에는 어떻게 해야할까? 별도의 이름을 갖는 BindingAdapter를 정의해야할까?
 사실 이미 위에서 언급한 것과…

[Android] DataBinding의 동작방식 - 2. BindingAdapter의 기본 및 사용 시점

이번에는 DataBinding을 사용할 때 그리 멀지 않은 시점에 찾게되는 BindingAdapter에 대해서 정리를 해보려고 한다. (InverseBindingAdapter에 대해서는 다음에 다루기로 한다)


"[Android] DataBinding의 동작방식" 전체목록
1. Setter Method와의 연결
2. BindingAdapter의 기본 및 사용 시점
3. BindingAdapter의 사용시 팁
4. include Tag 혹은 ViewStub 사용시의 Binding
5. Listener, Callback
6. InverseBinding (InverseBindingAdapter) + Two way Binding


1. BindingAdapter의 기본 : BindingAdapter는 "현재 정의되지 않은 Binding Attribute를 정의하고, 그 내부 로직을 작성"할때 쓰인다.
 사실 Android 기본 UI들을 위한 대부분의 BindingAdapter는 이미 정의가 되어있다. 예를 들어서 TextView에 관련된 BindingAdapter는 TextViewBindingAdapter.java 클래스 안에 정의가 되어있다. 일부만 살펴보면 아래와 같다.
publicclassTextViewBindingAdapter { privatestaticfinal String TAG = "TextViewBindingAdapters"; publicstaticfinalint INTEGER = 0x01; publicstaticfinalint SIGNED = 0x03; publicstaticfinalint DECIMAL = 0x05; @BindingAdapter("android:text") publicstaticvoid setText(TextView view, CharSequence text) { final CharSequence oldText = vi…

[Android] DataBinding의 동작방식 - 1. Setter Method와의 연결

아직 광범위하게 쓰이고 있는 것은 아니지만, 2015년도에 구글이 발표한 DataBinding이라는 개념이 있다.
이 DataBinding의 기본 사용법은 Developer Page에 워낙 자세하게 (심지어 한글) 정리되어있기 때문에, 굳이 별도로 사용법을 정리할 필요는 없다. 다만, Developer Page에 나와있지 않은 내용들도 꽤 있기 때문에 그에 관해서 몇화에 나눠서 정리해보려고 한다.
(아래 내용들은 Developer Page의 내용들을 어느정도 숙지 되었다는 전제로 진행됩니다.)

Developer Page Link : https://developer.android.com/topic/libraries/data-binding/index.html


"[Android] DataBinding의 동작방식" 전체목록
1. Setter Method와의 연결
2. BindingAdapter의 기본 및 사용 시점
3. BindingAdapter의 사용시 팁
4. include Tag 혹은 ViewStub 사용시의 Binding
5. Listener, Callback
6. InverseBinding (InverseBindingAdapter) + Two way Binding

DataBinding의 기본
: 어느정도 경력이 있는 개발자들은 조금 쓰다보면 알 수 있지만, DataBinding에서 중요한 것은, BuildTime에 Binding 코드가 생성된다는 것이다. 여기서 Binding Code라는 것은, "View와 Model을 연결해주는 작업을 대신 해주는 코드" 정도로 이해하면 된다.

 예를들어 activity_test.xml이라는 layout파일에 대응되는 Binding Code는 ActivityTestBinding.java라는 파일로 나타난다. 그리고 이 Class File 내에서는 View와 Model간의 관계를 XML상에 정의한 대로 Mapping 시켜주는 코드가 생성되어 있다. 이를 통해 개발자들은 View와 Model의 연결에 대한…