🎯 DataBinding
- xml파일에 Data를 연결해서 사용할 수 있게 도와주는 Android JetPack 라이브러리의 하나의 기능
- 양방향 데이터 결합을 지원
양방향 데이터 결합
- When properties in the model get updated, so does the UI.
- model 정보가 변경되었을 때 ui도 같이 변경되는 작업
- model 정보가 변경되었을 때 ui도 같이 변경되는 작업
- When UI elements get updated, the changes get propagated back to the model.
- ui 데이터가 변경되었을 때 그 내용이 model에 적용되는 작업
- ui 데이터가 변경되었을 때 그 내용이 model에 적용되는 작업
- When properties in the model get updated, so does the UI.
특징
- Databinding을 사용하면 findViewById(), 버터나이프를 쓰지 않아도 xml에 만든 View들을 자동으로 만들어 준다.
- Data가 바뀌면 알아서 바뀐 Data로 View를 변경하게 할수도 있다. (옵저블 사용시)
- RecyclerView에서 각각의 item을 세팅 해주는 작업도 xml에서 다 써주면 알아서 척척 값이 들어간다.
- 구글의 권장사항
사용
Gradle 설정
- android 4.0 이상
android { ... buildFeatures { dataBinding = true } }
- android 3.6 ~ 4.0
android { ... dataBinding { enabled = true } }
MainActivity
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
binding.user = UserProfile("지은", "이")
}
}
- infalte
- 생성된 binding 객체를 얻을 수 있는 메소드
- binding.root
- 현재 viewBinding 객체에서 가장 기본이 되는 layout을 반환
activity_main.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"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="user"
type="com.example.temp.UserProfile" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{user.firstName}" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{user.lastName}" />
</LinearLayout>
</layout>
- dataBinding은 가장 바깥에
<layout>
태그로 감싸주어야 하고<data>
를 통해 view에 보여질 값을 선언한다. - view에서는
@{}
를 통해 데이터를 화면에 뿌린다.-
@{}
는 다음과 같이 간편식으로도 적용이 가능하다.@{(userProfile.gender == UserProfile.GENDER_MALE) ? "남성" : "여성"}
-
🎯 ViewBinding
- view와 상호 작용하는 코드를 더욱 간편하게 할 수 있도록 하는 기능
- 이를 활용하여
findViewById
를 대체할 수 있다. - 많이 사용하는 DataBinding에서 많은 개발자들이 단순히 View에 대한 참조를 얻어서 사용했음
- 이를 본 구글이 View에 대한 참조 목적으로 ViewBinding을 지원하기 시작함
특징
- Null 안전
- 뷰의 직접 참조를 생성하므로 유효하지 않은 뷰 ID로 인해 null 포인터 예외가 발생할 위험이 없음
- 레이아웃의 일부 구성에만 뷰가 있는 경우 결합 클래스에서 참조를 포함하는 필드가
@Nullable
로 표시
- 유형 안전
- 각 바인딩 클래스에 있는 필드의 유형이 XML 파일에서 참조하는 뷰와 일치하기 때문에 클래스 변환 예외가 발생할 위험이 없다.
- 빠른 컴파일 속도와 따로 xml 파일에 태그가 필요하지 않고 자동으로 적용되므로 사용 편의성이 있다.
- Data Binding과 비교했을 때 레이아웃 변수 또는 레이아웃 표현식을 지원하지 않으므로 XML 레이아웃 파일에서 직접 동적 UI 콘텐츠를 선언하는 데 사용할 수 없음.
- 양방향 데이터 결합을 지원하지 않습니다.
- DataBinding에서는 코드에서 데이터를 받아와 xml에 적용이 가능했으나 ViewBinding에서는 불가함
사용
Gradle 설정
- android 4.0 이상
android { ... buildFeatures { viewBinding = true } }
- android 3.6 ~ 4.0
android { ... viewBinding { enabled = true } }
MainActivity
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.txtSample.text = "View Binding Sample"
}
}
- infalte
- 생성된 binding 객체를 얻을 수 있는 메소드
- binding.root
- 현재 viewBinding 객체에서 가장 기본이 되는 layout을 반환
activity_main.xml
<LinearLayout ... >
<TextView android:id="@+id/txt_sample" />
</LinearLayout>
dataBinding과 viewBinding의 차이
- 데이터 바인딩 라이브러리는
태그를 사용하여 만든 레이아웃만 처리 - 뷰 바인딩은 레이아웃 변수 또는 레이아웃 표현식을 지원하지 않으므로 XML의 데이터와 레이아웃을 바인딩하는 데 사용할 수 없다.
- 내부적으로 데이터 바인딩 클래스를 생성할때 루트뷰에 tag를 삽입하는데 뷰 바인딩은 그런 작업이 없다.
- 뷰 바인딩은 데이터 바인딩보다 어노테이션 프로세싱의 일부를 사용하기 때문에 더 빠르게 바인딩 클래스를 생성한다.