필자가 예전에 DataBinding 관련한 공부를 진행하면서 기본적인 사용 방법에 대해 간단히 작성해 둔 게시글이 있다.
이번에 클린 아키텍처 관련 예제를 작성하다 데이터 바인딩을 사용한 조금 더 심화(?)된 방법으로 사용하고 있는 것을 보고 정리겸 간단하게 사용법을 작성해 보려고 한다.
* 2020.06.15 - [AAC] - [DataBinding] 데이터 바인딩 기본 사용 방법
기본적인 바인딩 방법은 이전에 작성했던 게시글과 동일하다.
DataBindingUtil.setContentView 를 사용하여 레이아웃을 binding 하여 사용하면 된다.
위의 코드는 모든 Activity 에서 상속받아 사용하는 BaseActivity 이기 때문에 Activity 선언 시 layoutId 를 인자로 받아 해당 Activity 와 layout 을 binding 시켜주도록 하였다.
이처럼 Activity 선언 시 파라미터로 binding 할 layoutId를 넣어준다.
물론, 이처럼 Base 를 만들지 않고 사용하게 된다면 Base 에 선언했던 DataBindingUtil 부분을 이곳에서 선언하여 사용하면 된다.
xml 에서 binding 하여 사용하기 위해 onCreate 에서 viewModel 에 대한 것들도 binding 해주었는데, vm 은 DataBindingUtil 이 제공하는 함수 명이 아닌, 사용자가 xml 에 선언하는 이름이라고 보면 된다.
name 을 sample 이라고 작성했다고 가정하면, 위의 onCreate에서는 binding.sample = viewModel 이 되어야 하는 것이다.
이 때 name 에 언더 스코어(_) 를 붙일 수 있는데, 이러한 경우 언더 스코어를 그대로 사용하지 않고 바로 대문자로 붙여서 사용한다.
즉, name = vm_sample 이라면 binding.vmSample = viewModel 로 선언하면 되는 것이다.
위의 xml 을 보면 기본 방법과는 다른 방법으로 사용했음을 알 수 있다.
하나씩 확인해보자.
우선, bind 라고 선언된 부분은
필자가 직관적으로 구분하기 위하여 추가적으로 작성한 부분이다.
xml 선언 부 사진을 보면, xmlns:bind="~" 라고 선언된 부분을 확인할 수 있을 것이다. 이처럼 선언을 하게 된다면 xml 옵션을 추가할 때 위의 이미지 처럼 추가할 수 있는 것이다.
물론, bind 대신 기존에 작성 되어있던 app: 을 그대로 써도 상관 없으며, 아예 해당 부분을 생략해도 상관 없다.
사용자의 편의에 따라서 맞춰서 작성하면 된다.
그렇다면, 뒤의 endlessScroll, setItems 는 무엇인가?
필자가 데이터 바인딩 어댑터로 사용하기 위하여 어노테이션에 추가해 놓은 이름이다.
이게 무슨말인지는 하단의 코드를 보면 알 수 있다.
코드를 확인해 보면, @BindingAdpater 라는 어노테이션을 선언하고 그 안에 value 값으로 xml 에 추가된 이름을 확인할 수 있을 것이다.
이처럼 BindingAdpater 어노테이션을 선언하고 이름을 넣어주게 되면 해당 이름으로 선언된 함수를 bind 하여 사용할 수 있게 된다.
즉, 위의 코드 중 setItems 로 예를 들자면 rv_movies 라는 id 를 가지고 있는 RecyclerView 에 setItems 라는 이름으로 BindingAdapter 가 선언되어있는 함수를 수행시키고, 그 인자 값으로 vm.movieList 를 넣어라.
라는 얘기가 된다.
뭐, 설명은 길었지만 간단하게 사용방법은
1. BindingAdapter 어노테이션을 선언하고
2. 인자로 사용자가 사용할 이름을 넣고
3. 사용할 함수를 작성한다.
라고 보면 되겠다.
해당 게시글에 사용되는 예제 코드는 gitHub 에 업로드 해두었습니다.
https://github.com/HeeGyeong/CleanArchitectureSample
'Android > AAC' 카테고리의 다른 글
[Android] Jetpack DataStore 실전 압축 정리 (0) | 2022.02.17 |
---|---|
[Android] AAC Navigation 사용 실전 압축 정리 (0) | 2022.02.14 |
[Android] Room 라이브러리 (0) | 2020.06.22 |
[Android] ViewModel 기본 개념 (0) | 2020.06.22 |
[Android] LiveData 기본 개념 (0) | 2020.06.20 |