[안드로이드] databinding

:fire: DataBinding

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

:sparkles: DataBinding 사용의 장점

:sparkles: DataBinding 지원 조건

:sparkles: DataBinding 사용을 위한 환경 구축

:sparkles: DataBinding 구현 방법

* 레이아웃 xml 파일에 Data Binding을 적용해 바인딩 클래스 생성하기

  1. xml 파일의 루트 레이아웃을 <layout> 태그로 감싼다. ```xml <?xml version=”1.0” encoding=”utf-8”?>
...
<br>

2. 레이아웃의 뷰에 연결할 변수가 있을 경우, `<data>`태그와 `<variable>`태그를 이용해 변수를 선언한다.
  ```xml
<?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>


  1. @{} 구문을 이용하여 레이아웃 컴포넌트에 변수를 할당한다. ```xml <?xml version=”1.0” encoding=”utf-8”?>
<br>

* 레이아웃 xml 파일에 Data Binding을 적용하면 각 레이아웃 파일에 대해 바인딩 클래스가 생성된다.
* 생성되는 바인딩 클래스의 이름은 'Pascal 표기법으로 변환된 xml 파일의 이름' + 'Binding'이다. <br>
<sub>* `activity_main.xml` -> `ActivityMainBinding`</sub>
* 레이아웃 컴포넌트에 변수를 할당하지 않고, findViewById()의 호출을 대체하는 용도로만 사용할 경우엔 <br>
Data Binding 대신 View Binding을 사용하는 것이 권장된다.
<br>

#### * 생성된 바인딩 클래스를 바탕으로 바인딩 객체 만들기
```kotlin
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")
}

:memo: Reference