티스토리 뷰
https://www.youtube.com/watch?v=DAmMN7m3wLU
data binding을 적용하려고 하는데 제대로 알고 적용하고 싶어서 구글링하는 중에 Google I/O 영상을 찾았다.
40분 가량의 영상이고 ... 나를 위해 정리해본다 !
Data Binding 은 layout 으로부터 data를 호출하지 않게 해준다.
layout의 data를 호출하기 위해 매번 findViewById 를 이용하는 짓(? 영상에서는 이 짓이 suck이라고 표현함...ㅎㅎ)을 하지 않아도 된다.
그렇기 때문에 관심사 분리를 위한 MVVM 패턴 등의 적용된 앱에서 data binding을 사용하면 명확하게 관심사 분리가 가능해진다.
> 컴파일 과정에서의 Data Binding 처리 과정
- Process Layout Files : application을 컴파일하는 과정에서 각종 resource 파일들을 병합한다. 이 과정에서 layout의 data binding 되어 있는 부분은 제거된다.
- Parse Expressions : data binding을 위한 Expression들의 문법을 검증한다. ID 와 Field 들을 검증하면서 적합하지 않을 경우, Exception을 떨군다.
- Java Compilation : compile을 통해 얻은 application code ( java code ... )에서 layout 이나 그 외의 파일에서 얻은 어노테이션이 의미하는 바를 확인한다.
- Resolve Dependencies : 표현식의 내용이 변수인지 메소드인지 파악하고, 타입이 무엇인지 파악하면서 문법적으로 문제가 없는지 확인한다.
- Find Setters : 이렇게 검증을 마친 method를 호출하기 위해서 setter해야 하는 것이 무엇인지 확인한다.
- WriteView Binders : 이러한 과정을 통해 UI 를 업데이트 하기 위한 코드에 결합되어 컴파일이 이뤄진다.
> Two Way Data Binding
Two Way Data Binding이 가능하다. UI를 업데이트하기도 하고, 반대로 UI의 내용을 data model로 전달할 수 있다.
Two Way Data Binding 의 표현식 : @={ v.data }
-How is it Notified?
InverseBindingListener를 통해 변경상태를 확인하고 적용.
어댑터(TextViewBindingAdapter)를 이용해서 데이터를 가져오고, 변경사항이 있을 시, 적용(nameUser.set)함.
- Getting the View's Value
- Notifying
> Expression Chaining (No-code binding)
<- 기존의 표현식
반복적인 코드 작성의 문제
<- 새로운 표현식
tag에 id를 설정하면, 해당 id를 사용하여 값을 가져올 수 있음
> Lambda Expression (No-code binding)
이전까지는 layout의 data를 data model에 전달하기 위해서는 id를 설정하고 java 코드에서 해당아이디를 통해, click listener 를 호출해야 했다.
이를 Method Reference, Lambda Expression 을 통해 id할 필요 없이 layout에서 작성이 가능하다.
- Method Reference
<- android:onClick 속성에서 선택 시 동작할 작업을 입력
( 여기서는 Presenter 클래스의 onClick 메소드를 실행시킬 것이라고 정의 함 )
<- Presenter 코드에서는 onClick 메소드 내의 동작 과정을 작성
( data 태그 내의 variable에 작성된 Item 을 가져와서 저장함 )
그런데 !! Method Reference에는 여전히 불필요한 코드가 존재한다.
따라서 Lambda Expressions 을 소개한다.
- Lambda Expressions
MVVM 과 같은 패턴에 Lambda Expressions를 적용하면 명확히 관심사 분리가 되면서 Presenter부분에는 android code가 존재하지 않게 된다. 그렇기 때문에 테스트가 용이해진다. ( click 시 바로 Presenter의 save 작업 수행 )
<- Presenter의 save 메소드를 이용해 item을 data model에 제공한다는 것을 android:onClick 속성에 정의
<- Presenter 클래스 내에는 안드로이드 코드는 포함되어 있지 않고, 동작을 수행할 작업만 작성되어 있음
※ 단, Lambda Expression으로 파라미터 전달 시, onClickListener, onFocusChangeListener 등의 내부 메소드의 파라미터를 전부 작성해주던가 아예 작성하지 않아야 한다.(영상 : 18분 쯤...)
※ Layout 파일의 Lambda Expression은 컴파일 과정에서 제거되기 때문에 Lambda Expression으로 처리한 메소드의 반환 값을 통해 다른 업무를 수행하는 것은 불가능하다.(영상 : 18분 쯤...)
- Method Reference, Lambda Expression 비교
Lambda Expression : null 처리 불가능 (하지만... null처리가 불가능하기 때문에 항상 null safe 함 )
Method Reference : null 처리 가능
(영상 : 20분 쯤...)
- Special Variables
View IDs : tag의 id 를 camel 기법으로 표기
( ex : <TextView id="@+id/text_id" ... onClick = "@{() -> presenter.save(textId)}" )
Context : context 로 표기
( ex : <TextView ... onClick = "@{presenter.loadText(context, field)}" )
- animations
addOnRebindCallback 을 이용하여 animation 처리가 가능하며, Transitions을 이용해 delay가 가능하다. (영상 : 24분 쯤...)
'android' 카테고리의 다른 글
[android] data binding error 문제 해결 방법 (0) | 2020.07.18 |
---|---|
[Google I/O] Fun with LiveData (Android Dev Summit '18) 정리 (0) | 2020.07.13 |
[android] fragment 를 Dialog로 사용 시 크기 설정 방법 (0) | 2020.07.03 |
[android] Fragment 모서리 둥글게 (0) | 2020.07.03 |
[android] 매번 잊어버리는 android studio tool update (0) | 2020.07.01 |