Android: DataBinding

yxnsx·2020년 12월 3일
0

Dev: Android

목록 보기
1/8
post-thumbnail

DataBinding

프로그래밍 방식이 아닌 선언적 방식을 사용하여 레이아웃의 UI 구성 요소를
앱의 데이터 소스에 바인딩할 수 있는 Android Jetpack의 라이브러리


DataBinding 사용의 장점

  • 액티비티에서 UI 호출을 제거하여 코드를 더 간단하고 쉽게 유지 및 관리할 수 있다.
  • 앱의 성능을 개선하고 메모리 누수 및 널 포인터 예외를 방지하는 데에 도움이 될 수 있다.
  • 기본 데이터 소스가 변경될 때, UI 새로고침에 대해 걱정할 필요가 없다.
  • DataBinding 라이브러리와 함께 AAC를 사용하여 UI 개발을 더욱 단순화할 수 있다.


DataBinding 지원 조건

  • Android 4.0(API 레벨 14) 이상을 실행하는 기기
  • Android Gradle Plugin 1.5.0 이상
    build.gradle(Project)dependencies에 정의되어 있음


DataBinding 옵션 활성화

  • build.gradle(Module: app)에서 빌드 옵션 활성화
android {
    ...
    buildFeatures {
      dataBinding true
    }
}


DataBinding 구현 방법

1️⃣ 레이아웃 xml 파일에 DataBinding 적용하기

1) xml 파일의 루트 레이아웃을 <layout> 태그로 감싼다.

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

   <LinearLayout>
      ...
   </LinearLayout>
  
</layout>

2) 레이아웃의 뷰에 연결할 변수가 있을 경우, <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>
      ...
   </LinearLayout>
</layout>

3) @{} 구문을 사용하여 레이아웃 컴포넌트에 변수를 할당한다.

<?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}"/>
        
      </LinearLayout>
</layout>
  • 레이아웃 xml 파일에 DataBinding을 적용하면 각 레이아웃 파일에 대해 자동으로 바인딩 클래스가 생성된다.

  • 생성되는 바인딩 클래스의 이름은 Pascal 표기법으로 변환된 xml 파일명 + Binding이다.
    ㄴ activity_main.xml -> ActivityMainBinding

  • 레이아웃 컴포넌트에 변수를 할당하지 않고 findViewById()의 호출을 대체하는 용도로만 사용할 경우엔 DataBinding 대신 ViewBinding을 사용하는 것이 권장된다.

2️⃣ 생성된 바인딩 클래스를 바탕으로 바인딩 객체 만들기

override fun onCreate(savedInstanceState: Bundle?) {
   super.onCreate(savedInstanceState)
    
   // 방법 1 - LayoutInflater 이용
   val binding: ActivityMainBinding = DataBindingUtil.setContentView(
      this, R.layout.activity_main)
        
   // 방법 2 - ViewGroup 이용
   val binding: MyLayoutBinding = MyLayoutBinding.inflate(
      getLayoutInflater(), viewGroup, false)

   binding.user = User("Test", "User")
}
  • 바인딩 클래스는 layout inflating 시에 객체화하는 것이 권장된다.
  • 바인딩 객체는 레이아웃의 뷰에 대한 모든 바인딩을 보유하며, 레이아웃 컴포넌트에 값을 할당할 수 있다.


📝 References

0개의 댓글