반응형
이전 포스팅에서는 Data Binding의 추가적인 기능에 대해 살펴보았습니다.
이번에는 Data Binding의 Observability에 대해 정리해보려고 합니다.
Observability
객체가 데이터의 변경 사항을 알리는 것 입니다.
최초 데이터가 UI에 바인딩 된 후 데이터가 변경되면 자동으로 UI를 업데이트 하게 할 수 있습니다.
Obsevable field
예시1) 변수 선언
class User {
val firstName = ObservableField<String>()
val lastName = ObservableField<String>()
val age = ObservableInt()
}
예시2) ObservableField 변수 접근 및 업데이트
user.firstName = "Google"
val age = user.age
Observable collections
예시1) 변수 선언
ObservableArrayMap<String, Any>().apply {
put("firstName", "Google")
put("lastName", "Inc.")
put("age", 17)
}
예시2) XML에서 사용 선언
<data>
<import type="android.databinding.ObservableMap"/>
<variable name="user" type="ObservableMap<String, Object>"/>
</data>
…
<TextView
android:text="@{user.lastName}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:text="@{String.valueOf(1 + (Integer)user.age)}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
Observable objects
Observable 인터페이스를 구현한 클래스는 데이터의 변화를 감지하기 위한 리스너를 등록할 수 있습니다.
BaseObservable 클래스를 상속 받고, 리스너 등록을 통해 변경된 데이터를 알려주는 역할을 합니다. 아래의 코드가 위의 역할을 합니다.
class User : BaseObservable() {
@get:Bindable
var firstName: String = ""
set(value) {
field = value
notifyPropertyChanged(BR.firstName)
}
@get:Bindable
var lastName: String = ""
set(value) {
field = value
notifyPropertyChanged(BR.lastName)
}
}
위 코드에서, Data Binding에 사용되는 리소스의 ID들을 포함하고 있는 BR이라는 이름을 가진 클래스를 생성합니다.
Bindable이라는 어노테이션은 컴파일 중에 BR 클래스에 있는 Entry를 생성합니다.
Lifecycle-aware objects
데이터 변경 시 UI에 자동으로 알려주기 위해 레이아웃과 바인딩을 한 후에는, 바인딩이 수명 주기를 알고 UI가 화면에 표시될 때에만 데이터 변경에 업데이트 됩니다. (StateFlow, LiveData)
반응형
'DEV > Android' 카테고리의 다른 글
[Android] Jetpack - Lifecycle - 2 (0) | 2023.03.21 |
---|---|
[Android] Jetpack - Lifecycle - 1 (0) | 2023.03.21 |
[Android] Jetpack - Data Binding - 2 (0) | 2023.03.14 |
[Android] Jetpack - Data Binding - 1 (0) | 2023.03.11 |
[Android] Jetpack (0) | 2023.03.11 |