• Home
  • About
    • Zzu-h photo

      Zzu-h

      주니어 Android 개발자입니다.

    • Learn More
    • Email
    • Instagram
    • Tistory
    • Github
  • Posts
    • All Posts
    • All Tags
    • All Categories
  • Projects

Android: Binding

23 Mar 2022

Reading time ~3 minutes

image

🎯 DataBinding

  • xml파일에 Data를 연결해서 사용할 수 있게 도와주는 Android JetPack 라이브러리의 하나의 기능
  • 양방향 데이터 결합을 지원

    양방향 데이터 결합

    1. When properties in the model get updated, so does the UI.
      • model 정보가 변경되었을 때 ui도 같이 변경되는 작업
    2. When UI elements get updated, the changes get propagated back to the model.
      • ui 데이터가 변경되었을 때 그 내용이 model에 적용되는 작업

특징

  • 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를 삽입하는데 뷰 바인딩은 그런 작업이 없다.
  • 뷰 바인딩은 데이터 바인딩보다 어노테이션 프로세싱의 일부를 사용하기 때문에 더 빠르게 바인딩 클래스를 생성한다.


UMCbindingDataBindingviewBindingAndroid Share Tweet +1