기존에는 xml에서 view를 끌어올때에는 findviewbyid()함수를 사용하였다. 그 이후에 ktx를 이용하여 가져오는 것도 가능하였지만 이제는 data binding을 사용할 것을 구글에서 권장하고 있다.
findviewbyid()함수는 app의 모든 view 중에서 해당 id를 가진 view를 가져오는 작업을 1프레임마다 실행하기 때문에 규모가 큰 앱에서는 성능저하 문제를 가져올 수 있다.
원래 내가 알고 있기로는 view binding을 이용해서 findviewbyid()함수를 대체할 수 있지만 data binding을 통해서도 대체 가능한 것 같다.
data binding은 xml에서 태그로 감싸져 있는 것들만 가져 올 수 있기 때문에 가져올 액티비티의 전체를 태그로 감싸줄 필요가 있다.
data binding의 장점으로는 위와 같은 것들이 있다고 한다.
findviewbyid()와 data binding의 큰 차이점은 findviewbyid()는 run time에 실행되고 data binding은 compile time에 실행되기 때문에 오류가 있을 시 컴파일 단계에서 잡아낼 수 있다.(오류 코드가 무엇인지 알 수 있다)
나중에 view binding을 배우게 되면 둘의 차이점을 더 자세히 알 수 있을 듯 하다.
data binding 사용법
android {
dataBinding{
enabled = true
}
}
최신 버전은
android {
buildFeatures{
dataBinding = true
}
}
가져오고자 하는 view가 있는 액티비티로 가서 태그로 감싸기
액티비티에 해당하는 .kt 혹은 .java 파일로 가서 binding 객체 만들기
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
}
binding.(view id) 형태로 view를 불러올 수 있다.
binding.apply{} → apply 안에서는 binding을 객체를 사용하지 않아도 자동으로 적용됨
binding.nameText.text = "hi"
binding.apply{
nameText.text = "hi"
}
태그를 이용해서 .kt 에서 xml로 데이터를 보낼 수 도 있다.
textview의 text를 지정하는 기존 방식
var name : String = "kim"
var email : String = "wofo@gmail.com"
binding.nameText.text = name
binding.emailText.text = email
태그를 이용한 방식
xml
<data>
<variable>
name="student"
type="Student" // 미리 만들어 둔 데이터 클래스
</data>
...
<TextView
...
android:text="@{student.name}
...
/>
.kt
binding.student = getStudent()
...
private fun getStudent() : Student{
return Student(1, "Alex", "alex@gmail.com")
}
Student.kt
data class Student(
var id:Int,
var name:String,
var email:String
)