[Android] Jetpack - Data Binding - 2

반응형

이전 포스팅에서는 Data Binding에 대해 간략하게 살펴보았습니다.

 

[Android] Jetpack - Data Binding - 1

이전 포스팅에서는 Jetpack에 대한 간략한 정리를 해보았습니다. 이번 포스팅부터는 Jetpack을 이루는 각각의 Library에 대해서 정리해보려고 합니다. Data Binding Data Binding이란 말 그대로 "데이터를 연

weirddev.tistory.com


이번에는 이전 포스팅에 이어서 추가 정리 해보려고 합니다.

 

Event Handling

Data Binding을 사용하여 UI에서 전달된 이벤트를 컨트롤 할 수 있습니다.

해당 기능은 2가지 방식으로 개발이 가능합니다.

 

Method reference

Handler 함수에 직접 바인딩하는 방식. 컴파일에 생성되기 때문에, 함수가 없거나, xml에 정의된 부분이 에러가 있다면, 컴파일 에러가 발생한다.

예시1) 함수 선언

class MyHandlers {
    fun onClickFriend(view: View) { ... }
}

 

예시2) XML에서 사용 선언

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="handlers" type="com.example.MyHandlers"/>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.firstName}"
           android:onClick="@{handlers::onClickFriend}"/>
   </LinearLayout>
</layout>

 

Listener bindings

이벤트가 발생했을 때 실행하는 방식. Method binding과  유사하지만, 임의의 식을 작성할 수 있다.

 

예시1) 함수 선언

class Presenter {
    fun onSaveClick(task: Task){}
}

 

예시2) XML에서 사용 선언

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
       ...
    </data>
    <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent">
        <Button android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:onClick="@{() -> presenter.onSaveClick(task)}" />
    </LinearLayout>
</layout>

표현식에서 콜백을 사용하면, 필요한 리스너를 자동생성한 후 이벤트에 등록합니다.

UI에서 이벤트를 전달하면, 표현식을 검사하여, null과 thread safety에 대한 안전성을 가져갑니다.

 

Imports, variables, and includes

Imports

레이아웃 파일에 Import를 한 뒤에, 해당 클래스의 변수 등을 사용할 수 있습니다.

 

예시) View 클래스를 Import하여 해당 변수를 사용한 식을 작성

<data>
    <import type="android.view.View"/>
</data>

...

<TextView
   android:text="@{user.lastName}"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"/>

 

추가로, 동일한 클래스를 Import할 시 구분을 위해 alias도 지정할 수 있습니다.

 

예시) 

<import type="android.view.View"/>
<import type="com.example.real.estate.View"
        alias="Vista"/>

 

또한, 여러개의 클래스를 Import한 후 서로 타입을 참조할 수 있습니다.


예시) User 클래스와 List 클래스를 Import한 후 userList 변수 선언 및 사용

<data>
    <import type="com.example.User"/>
    <import type="java.util.List"/>
    <variable name="user" type="User"/>
    <variable name="userList" type="List&lt;User>"/>
</data>

 

마지막으로, Import한 클래스로 캐스팅하거나, 정적 변수나 함수를 사용할 수도 있습니다.

Variables

레이아웃 파일에서 Data 요소에 변수를 선언하여 사용할 수 있습니다.
예시)

<data>
    <import type="android.graphics.drawable.Drawable"/>
    <variable name="user" type="com.example.User"/>
    <variable name="image" type="Drawable"/>
    <variable name="note" type="String"/>
</data>

 

Include

사용중인 레이아웃에서 xml파일을 추가하여 사용할 수 있습니다.
예시) name, contact라는 이름의 레이아웃에 user 변수를 전달합니다.

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:bind="http://schemas.android.com/apk/res-auto">
   <data>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <include layout="@layout/name"
           bind:user="@{user}"/>
       <include layout="@layout/contact"
           bind:user="@{user}"/>
   </LinearLayout>
</layout>

 

다음 포스팅에서는 Data Binding의 Observable 관련 내용을 정리하겠습니다.

 

반응형

'DEV > Android' 카테고리의 다른 글

[Android] Jetpack - Lifecycle - 1  (0) 2023.03.21
[Android] Jetpack - Data Binding - 3  (0) 2023.03.15
[Android] Jetpack - Data Binding - 1  (0) 2023.03.11
[Android] Jetpack  (0) 2023.03.11
[Android] Clean Architecture in Android  (0) 2023.03.11