반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- ReactiveProgramming
- 알고리즘
- 알게되는
- viewmodel
- theming
- k8s
- 코루틴
- g 단위테스트
- kotlin강좌
- 스레드
- Rxjava
- 안드로이드스튜디오
- 자바
- android
- Compose
- 회고
- Kotlin
- Gradle
- 테스트
- 코틀린
- 병렬프로그래밍
- 병럴프로그래밍
- 글또
- 커스텀상태
- Coroutine
- mockito
- 책
- 안드로이드강좌
- 디자인패턴
- 안드로이드
Archives
- Today
- Total
선생님, 개발을 잘하고 싶어요.
[Android] DataBinding, Custom View에 two-way binding을 하는 방법 본문
two-way binding을 하기 위해서 총 3가지의 함수가 필요합니다. 각 용도는 이런 식으로 생각할 수 있는데요.
- 데이터를 받아서 view에 설정하는 것 (BindingAdapter)
- view의 데이터가 변경되었을 때, 변경된 데이터 받아오는 것 (InverseBindingAdapter)
그런데, InverseBindingAdapter는 어떻게 view 데이터 변경을 알아차리는 걸까요? 바로, InverseBindingAdapter의 관련된 event를 등록하고, 해당 이벤트의 인자로 들어오는 InverseBindingListener.onChange()가 호출되는 순간을 알게되는 겁니다.
- view의 데이터가 변경되었음을 알리는 이벤트를 등록하는 것 (android:xxxxAttrChanged)
여기서 xxxx는 우리가 InverseBindingAdapter로 등록한 attribute의 이름으로 기본 설정됩니다.
// how to implement two-way binding in custom view.
@BindingAdapter("app:days")
fun DayChooser.setDaysList(days: List<Int>) {
if (this.days != days) {
this.days = days
}
}
@InverseBindingAdapter(attribute = "app:days")
fun DayChooser.getDaysList() = this.days
@BindingAdapter("app:daysAttrChanged")
fun DayChooser.setDaysChangedListener(attrChange: InverseBindingListener) {
this.addOnChangeListener(object : DayChooser.OnChangeListener {
override fun onChange(days: List<Int>) {
attrChange.onChange()
}
})
}
이를 위해서 커스텀 뷰를 만들 때 하나 해주어야 하는게 있는데요. 바로, InverseBindingListener를 통해서 value가 변경될 때, onChange를 발생시키도록 콜백을 등록할 수 있게 해주어야 한다는 겁니다. 커스텀 data change listener를 지정하고 등록해주시면 됩니다.
'개발 > android 개발' 카테고리의 다른 글
[코틀린] 중첩된 Coroutine 에러 처리 (0) | 2021.12.12 |
---|---|
안드로이드에서 ISO 8601를 파싱하는 가장 깔끔한 방법 (0) | 2021.09.24 |
[Android] Custom Font 적용 시 OutOfMemory 발생 및 해결 (0) | 2021.08.26 |
[Lifecycle] Activity Lifecycle 각 callback 마다 무슨 작업을 하는 것이 좋을까? (0) | 2021.04.04 |
[Deploy] Android App Bundle 을 (늦었지만) 알아보자. (0) | 2021.04.04 |
Comments