※ DataBinding 이란?
- 데이터와 뷰를 연결하는 작업을 레이아웃에서 처리 할 수 있게 해주는 라이브러리
findViewById<TextView>(R.id.sample_text).apply {
text = viewModel.userName
}
예를들어, textView에 뷰모델에서 가져온 유저네임을 가져오는 코드를
<TextView
android:text="@{viewmodel.userName}" />
레이아웃에서 직접 결합할 수 있게 된다.
파일이 더욱 단순화 되어 유지관리가 쉬워지고 메모리 누수 방지, null 위험을 방지할 수 있는 장점이 있다.
사용해보기
buildFeatures {
dataBinding true
}
bulid.gradle (Module) 의 android에 추가해준다.
그 후 기존 xml 코드를
layout이 감싸고 연결데이터를 표시하는 data 가 있는 형태로 바꿔줘야 한다.이 과정은 직접 해도되지만
기존 레이아웃에서 ALT + ENTER 를 누른 후 Convert하면 자동으로 바꿔준다.
data class User(val firstName: String, val lastName: String)
그 후 예시로 User 데이터 클래스를 만들어 준다.
xml에서 variable에 아까 만든 데이터클래스를 연결하고
텍스트를 설정해준다. 레이아웃 내의 표현식은 @{} 구문으로 작성한다.
package org.techtown.databinding
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.databinding.DataBindingUtil
import org.techtown.databinding.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
// lateinit 사용
private lateinit var binding : ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// binding class 인스턴스 생성
binding = DataBindingUtil.setContentView(this,R.layout.activity_main)
binding.user = User("Yeop","Han")
}
}
viewBinding 와 마찬가지로 DataBinding을 사용 설정하게 되면,
각 XML 파일 마다 바인딩 클래스가 자동으로 생성된다. ViewBinding과 차이점은 뷰에 대한 정보와 함께 <data>에 정의된 정보도 포함하는 것의 차이가 있다.
바인딩이 잘 된것을 확인할 수 있다.
package org.techtown.databinding
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.databinding.DataBindingUtil
import org.techtown.databinding.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
// lateinit 사용
private lateinit var binding : ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// binding class 인스턴스 생성
binding = ActivityMainBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
binding.user = User("Yeop","Han")
}
}
또한 ViewBinding을 할때처럼 사용해도 오류없이 동작한다.
github.com/HanYeop/AndroidStudio-Practice/tree/master/DataBinding
참조
developer.android.com/topic/libraries/data-binding/expressions