binding 기능을 사용하면 뷰와 상호작용하는 코드를 쉽게 작성할 수 있다.
모듈에서 사용 설정된 ViewBinding은 모듈에 있는 각 XML 레이아웃 파일의 결합 클래스를 생성합니다.
binding Class의 인스턴스에는 상응하는 레이아웃에 ID가 있는 모든 뷰의 직접 참조가 포함된다.
쉽게 말하자면 xml 레이아웃의 아이템들을 findViewById 보다 간편하게 가져와 사용할 수 있다.
대부분의 경우 ViewBinding이 findViewById를 대체한다.
Null safety: ViewBinding은 뷰에 대한 직접 참조를 생성하기 때문에 View ID가 잘못됨으로 인한 NPE를 발생시킬 위험이 없다.
Type safety: 각 바인딩 클래스의 필드에는 XML 파일에서 참조하는 뷰와 일치하는 타입을 갖고 있어, 클래스를 캐스팅할 때 발생할수 있는 오류가 없다.
레이아웃 파일과 실제 자바/코틀린 코드간에 일치하지 않아 발생하는 문제가 런타임이 아닌 컴파일타임에 발생하기 때문에 더 빠르게 에러를 잡고, 개발자는생산성을 늘릴 수 있습니다.
android {
...
viewBinding {
enabled = true
}
}
private lateinit var binding: ActivityMainBinding
// activity_main.xml = ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
binding = ResultProfileBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
}
참고로!
class TodoListHolder(val binding: ItemTodoBinding) : RecyclerView.ViewHolder(binding.root)
와 같이 .root 를 통해 본인이 어떤 뷰로 부터 생성된 바인딩인지 확인 가능하다.
class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemSelectedListener {
// View Binding 사용 순서 1
private var _binding : ActivityMainBinding? = null
val binding get()= _binding!!
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// View Binding 사용 순서 2
_binding = ActivityMainBinding.inflate(layoutInflater)
// View Binding 사용 순서 3
// bottomNavigationView = findViewById(R.id.nav_bottom)
// bottomNavigationView.setOnNavigationItemSelectedListener(this)
binding.navBottom.setOnNavigationItemSelectedListener(this)
}
override fun onDestroy() {
super.onDestroy()
// 구현순서 4
// 추가적으로!! Activity가 destroy 될 때 binding객체도 없애야 좋다.
_binding = null
}