8월, 2017의 게시물 표시

[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는 ViewPa...

[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"?> <layout xmlns:android= "http://schemas.android.com/apk/res/android" > <data> <variable name= "handlers" type= "com.example.Handlers" /> <variab...

[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" /...

[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" ) public static void 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로 L...

[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 클래스 안에 정의가 되어있다. 일부만 살펴보면 아래와 같다. public class TextViewBindingAdapter { private static final String TAG = "TextViewBindingAdapters" ; public static final int INTEGER = 0x01; public static final int SIGNED = 0x03; public static final int DECIMAL = 0x05; @BindingAdapter( "android:t...