자주 사용하는 AAC 이긴 하지만
남에게 설명할 수 없을 때, 완벽하게 이해하지 못한 것이라는 말을 생각하여 정리하게 되었다.
안드로이드에서 DataBinding 이란?
프로그래매틱 방식이 아니라 선언적 형식으로 레이아웃의 UI 구성요소를 앱의 데이터 소스와 결합할 수 있는 지원 라이브러리이다.
Android Jetpack 중 구성요소이기도 하다.
예전에는 ButterKnife 라이브러리가 있었지만 어느 순간 사라지고 Databinding만 남았다.
(그리고 난 괜히 소스 라인만 많아지는 것 같아서 ButterKnife 쓰기가 너무 싫었다.)
아래 링크를 보면 너무나도 설명을 잘 해주고 있다.
https://developer.android.com/topic/libraries/data-binding
DataBinding 을 사용하는 이유?
데이터바인딩을 사용하게 되면 데이터와 UI 요소 결합을 위해 필요한 코드를 최소화할 수 있다.
이것 또한 장점과 단점이 있다.
장점
- findViewId()를 호출하지 않아도 xml에 있는 view를 만들어준다
- RecyclerView 각각의 item에 data를 넣어주는 작업도 진행된다
- data가 바뀌어도 자동으로 view 변경이 가능하다
- xml 소스만 봐도 view에 어떤 데이터가 들어가 있는 지 확인이 쉽다
- 코드 가독성이 높아지고, 코드량이 줄어든다
- MVP 패턴과 MVVM 패턴을 구현할 때 유용하게 사용할 수 있다
단점으로는 클래스 파일이 많아지고 빌드 속도가 느려질 수가 있다고 한다.
그럼에도 내가 사용하는 이유는 단점보다 장점이 더 많고
빌드 속도가 느려진다 하더라도 크게 큰 차이를 못 느꼈었다.
그리고 무엇보다 findViewId()를 안 써도 된다는 게 정말 다행스럽다.
물론 findViewId()가 나쁜 것은 아니지만 1개의 데이터 모델을 갖고 findViewId()로 일일이 xml의 있는 view에 데이터 작업을 하게 될 때 이게 정말 노가다라는 생각을 했다.
그리고 Android Jetpack 에도 들어가서 따로 라이브러리를 implemetation 해 줄 필요가 없다.
DataBinding 사용하는 방법
1. app/build.gradle 추가
android {
...
dataBinding {
enabled = true
}
}
또는
android {
...
buildFeatures {
dataBinding = true
}
}
2. layout 추가
DataBinding 을 사용하는 xml 리소스는 <layout></layout> 태그부터 시작해야 한다.
activity_test.xml
<?xml version="1.0" encoding="UTF-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:background="@color/black"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="title"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text=""
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
3. Activity 수정
TestActivity.kt
class TestActivity : AppCompatActivity() {
private lateinit var bind: ActivityTestBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
bind = DataBindingUtil.setContentView(this, R.layout.activity_test)
}
}
여기서 ActivityTestBinding 은 activity_test.xml 의 binding class 로 <layout></layout> 태그가 붙는 xml에 한해 자동으로 클래스가 생성된다.
클래스 이름은 xml 파일 이름에 Binding이 붙여져 binding class인걸 확실하게 인식시켜준다.
그리고 해당 Activity에서 binding class를 인식할 수 있도록 setContentView()를 DataBindingUtil.setContentView()로 수정시켜준다.
여기까지가 기본적인 설정이다.
data와 결합하는 방식은 위에 activity_test.xml과 같이
<layout> 태그 안에 있는 <data></data> 태그에 <variable>이라는 태그를 통해 선언하면 된다.
하나는 data class를 통해 선언하는 방식과 하나는 String 을 통해 선언하는 방식을 설명하겠다.
4. Data Class 선언
데이터 결합을 위해 테스트 데이터 클래스를 만들었다.
data class HiModel(
val title: String,
val content: String
)
5. Data 와 결합을 위해 xml 수정
<layout> 태그 안에 <data></data>를 선언하여 <variable> 으로 data class를 연결하였다.
<variable> 에서 name은 type을 쓸 수 있게 만들어주는 이름으로 간단하게 짓는 것이 좋다.
name="hi" 는 만들어둔 HiModel data class 를 가져온 것이다.
name="comment"는 String 타입으로 activity에서 선언해줄 수 있다.
xml 리소스 내에서 "@{}" 구문을 사용하여 각 데이터들을 선언해 주었다.
<?xml version="1.0" encoding="UTF-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="hi"
type="com.example.HiModel" />
<variable
name="comment"
type="String" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{hi.title}"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{comment}"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
여기서 default 값도 설정할 수 있는데 아래와 같은 방법으로 하면 된다.
android:text="@{comment, default=TEXT}"
6. Data 와 결합을 위해 Activity 수정
class TestActivity : AppCompatActivity() {
private lateinit var bind: ActivityTestBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
bind = DataBindingUtil.setContentView(this, R.layout.activity_test)
val hiModel = HiModel("타이틀", "콘텐츠")
bind.hi = hiModel
bind.comment = "코멘트"
}
}
실행하면 activity에서 넣은 값이 xml에 적용되어서 보여진다.
'Study > Android' 카테고리의 다른 글
Kotlin SingleTon with Fragment (0) | 2021.10.06 |
---|---|
[공유] RecycleView Animation (0) | 2021.08.23 |
ANR(Application Not Responding) (0) | 2021.08.18 |
Dagger2 DaggerAppComponent Not Found (1) | 2021.08.11 |
[Kotlin] 기본 (0) | 2020.09.24 |