이전 포스팅에서는 Data Binding에 대해 간략하게 살펴보았습니다.
이번에는 이전 포스팅에 이어서 추가 정리 해보려고 합니다.
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<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 |