Null Safety: findViewById 사용 시 Null Pointer Exception이 발생할 실수를 컴파일 타임에 잡아낼 수 있다.
Type Safety: findViewById 사용 시 Class Cast Exception이 발생할 실수를 컴파일 타임에 잡아낼 수 있다.
findViewById 는 ,현 파일에 존재하지 않는 View ID 를 인자로 전달할 경우 Null Pointr Exception 이 발생한다.
View 를 잘못된 타입으로 캐스팅할 시 Class Case Exception 발생한다.
태그를 순회하여 일치하는 뷰를 검색하기 때문에 속도가 저하된다.
아래 구문을 추가해야 한다.
// Available in Android Gradle Plugin 3.6.0
android {
...
viewBinding {
enabled = true
}
}
// Android Studio 4.0
android {
...
buildFeatures {
viewBinding = true
}
}
특정 레이아웃 파일을 클래스로 바인딩하고 싶지 않다면, 해당 파일 root view에 tools:viewBindingIgnore="true" 속성 추가! (네임 스페이스로 toolsNS 추가되어있어야 함)
<LinearLayout
...
xmlns:tools="http://schemas.android.com/tools"
tools:viewBindingIgnore="true" >
...
</LinearLayout>
Activity 에 ViewBinding 적용
뷰로 사용할 바인딩 클래스의 inflate() static 메소드 호출하여 바인딩 클래스 인스턴스를 생성
getRoot() 메소드 통해 root view 참조
해당 root view가 화면에 표시되도록 setContentView()를 통해 content view로 설정
class MainActivity: AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// setup instance
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// use instance
binding.name.text = viewModel.name
binding.button.setOnClickListener {
viewModel.userClicked();
}
}
}
setContentView() 메소드를 resource id와 함께 사용하면 에러가 난다.
이 경우 레이아웃은 두 번 생성되고, listener는 잘못된 레이아웃 오브젝트에 설정된다.
뷰 바인딩을 사용할 때는 setContentView(binding.getRoot())
아직 뷰 바인딩 내용을 전부 이해하지는 못했지만 사용하니까 확실히 더 편한 것 같아요. ㅎㅎ