안드로이드 스튜디오 3.6 이상 버전에서 부터 나온 XML 뷰와의 상호작용 을 위한 기술입니다. 기존의 findViewById에서 안정성을 강화 하였습니다.
앱수준의 build.gradle의 android 필드 안에 다음과 같은 코드를 넣어 주셔야 합니다.
android {
// 생략..
buildFeatures {
viewBinding true
}
// 생략..
}
class MainActivity : AppCompatActivity() {
// 결합 클래스 인스턴스화 (결합 클래스명은 카멜표기법을 따른다.)
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 결합 클래스에 포함된 정적 inflace() 메서드 호출
binding = ActivityMainBinding.inflate(layoutInflater)
// 루트뷰를 setContentView()에 전달하여 활성뷰로 만듬
setContentView(binding.root)
}
}
다음 코드와 같이 binding
을 사용하여 버튼을 호출하고 Toast 메세지를 띄웁니다.
binding.button.setOnClickListener {
Toast.makeText(this, "with ViewBinding.", Toast.LENGTH_LONG).show()
}
뷰 바인딩은 기존의 findViewById
에서 안정성과 보일러 플레이트 코드를 개선한 기술입니다. 그렇기 때문에 뷰 바인딩은 다음과 같은 이점이 있습니다.
findViewById
를 사용하면 뷰를 참조할 때 다음과 같은 코드를 사용해야 합니다.
val button = findViewById<Button>(R.id.button)
만약 뷰가 20개 있다면? 20줄을 저런식으로 거창하게 써야합니다.
반면, 뷰 바인딩을 사용하면 button
변수 선언 없이 바로 뷰에 접근할 수 있습니다.
findViewById
를 사용할 때면 뷰 id를 잘못작성한 것 때문에 NPE(NullPointerException) 이 발생할 때가 종종 있었습니다.
그러나 뷰 바인딩은 뷰의 직접 참조를 생성하므로 유효하지 않은 뷰 ID로 인해 NPE가 발생할 위험이 없습니다.
바인딩 클래스(ActivityMainBinding)의 필드 유형은 XML의 뷰와 완전히 일치합니다. 그렇기 때문에 Class Cast Exception 이 발생할 위험이 없습니다.