데이터 결합을 사용 설정하려면 아래와 같이
모듈의 build.gradle 파일에서 dataBinding 빌드 옵션을 true로 설정합니다.
보통 MVVM 패턴을 구현 할 때 "LiveData"와 함께 거의 필수적으로 사용합니다.
android {
...
buildFeatures {
dataBinding true
}
}
비교
이전의 TextView선언 당시
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"/>
</LinearLayout>
데이터 바인딩을 사용하기 위해서는
최상단의 ConstraintLayout을 layout 아래로 둡니다.
그리고 data, variable을 추가합니다.
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="user" type="com.example.User"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"/>
</LinearLayout>
</layout>
data 내의 user 변수는 이 레이아웃 내에서 사용할 수 있는 속성을 설명합니다.
type은 사용할 클래스 User의 패키지 경로이다.
<variable name="user" type="com.example.User" />
레이아웃 내의 표현식은 '@{}' 구문을 사용하여 특성 속성에 작성됩니다. 여기서 TextView 텍스트는 user 변수의 firstName 속성으로 설정됩니다.
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}" />
런타임 시 앱의 UI에는 테스트 사용자가 표시됩니다. 또는 다음 예에서와 같이 LayoutInflater를 사용하여 뷰를 가져올 수 있습니다.
ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());
Fragment, ListView 또는 RecyclerView 어댑터 내에서 데이터 결합 항목을 사용하고 있다면 다음 코드 예에서와 같이 결합 클래스 또는 DataBindingUtil 클래스의 inflate() 메서드를 사용할 수도 있습니다.
*참고 ActivityMainBinding클래스는 실제로 없습니다. 안드로이드에서 자동적으로 만들어 줍니다.
그래서 ReBuild 하기 전까지 오류로 표시될것입니다.
하지만 따라가야할 규칙이 있습니다. 멤버변수 클래스 네임은 xml파일을 따라갑니다.
activity_main.xml -> ActivityMainBinding
activity_content.xml -> ActivityContentBinding
activity_love.xml -> ActivityLoveBinding
main_act.xml -> MainActBinding
love_act.xml -> LoveActBinding
출처: https://tlshenm.tistory.com/55 [No Job Of Star]
3. 결론
위 샘플용 코드는 간단하게 어떤 형식으로 사용을 하는지 알아보는 예제 입니다.
데이터 집합 클래스를 Bind 해서 해당 클래스가 변경되면
연결된 여러개의 View가 한번에 변경되기 때문에 엄청나게 편해집니다.
또 Databinding과 같이 BindingAdapter를 이용해 ImageView에 Glide, Fresco 같은 이미지 로딩 라이브러리를 이용해서 이미지를 출력을 쉽게 할 수 있고
Databinding과 LiveData를 사용하면 Data가 실시간으로 변경될 때
View도 같이 변경되니 MVVM 패턴 구현 시 엄청나게 편리해집니다.
정리하면 다음과 같습니다.
- Databinding을 사용하면 findViewById(), 버터나이프를 쓰지 않아도 xml에 만든 View들을 자동으로 만들어 준다.
- Data가 바뀌면 알아서 바뀐 Data로 View를 변경하게 할수도 있다. (옵저블 사용시)
- RecyclerView에서 각각의 item을 세팅 해주는 작업도 xml에서 다 써주면 알아서 척척 값이 들어간다. (요거 엄청 편리합니다.)
- JakeWharton의 Butterknife가 Deprecated 되었고 구글에서 권장하므로 앞으로는 Databinding을 사용 해야한다.
풀 소스
XML R.layout.activity_view_bind
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="user" type="com.woongs.woongsProject.View_Bind.User"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"/>
</LinearLayout>
</layout>
View_bind.class
package com.woongs.woongsProject;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import android.os.Bundle;
import com.woongs.woongsProject.databinding.ActivityViewBindBinding;
public class View_Bind extends AppCompatActivity {
public ActivityViewBindBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_view_bind);
binding = DataBindingUtil.setContentView(this, R.layout.activity_view_bind);
User user = new User("Test", "User");
//binding.setUser(user);
// inflater를 사용하는 경우
// ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());
//Fragment, ListView 또는 RecyclerView 어댑터 내에서 데이터 결합 항목을 사용하고 있다면
// 다음 코드 예에서와 같이 결합 클래스 또는 DataBindingUtil 클래스의 inflate() 메서드를 사용할 수도 있습니다.
//ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false);
// or
//ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);
}
public class User {
private final String firstName;
private final String lastName;
public User(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return this.firstName;
}
public String getLastName() {
return this.lastName;
}
}
}
주의사항
- 뷰모델의 경우 앞의 첫 글자는 대문자
- 경로중에 대문자로 시작하는 디렉터리가 있으면 안됨...
- 텍스트에 값을 적용하는 경우 int 형인 경우 string 으로 변환후 적용
( 예시 : android:text="@{String.valueOf(viewmodel.age)}" )
기본적으로 결합 클래스는 레이아웃 파일 이름을 기반으로 하여
대문자로 시작하고 밑줄(_)을 삭제하며
다음 문자를 대문자로 표기하고
Binding이라는 단어를 접미사로 추가하는 방법으로 생성됩니다.
developer.android.com/topic/libraries/data-binding/generated-binding
참고 :
velog.io/@jojo_devstory/Android-Databinding%EC%9D%84-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90
'Android AAC' 카테고리의 다른 글
DATA_Binding : Fragment (0) | 2022.03.10 |
---|---|
MVVM LiveData (1) (0) | 2021.02.22 |
Android AAC : LiveData (0) | 2021.01.07 |
Android ACC : Lifecycles (0) | 2021.01.06 |
Android AAC 란? (0) | 2021.01.06 |