뷰 바인딩(view binding)
기존의 방법은 XML 파일에 등록한 뷰를 findViewById() 함수로 얻어서 사용했었습니다. 이렇게 할 경우 일일이 findViewByID()함수로 하나하나 찾아서 가져와야 한다는 애로사항이 있었습니다. 그래서 XML 파일에 선언한 뷰 객체를 코드에서 쉽게 이용하기 위해 나온 방법이 뷰 바인딩입니다.
- gradle 파일에 뷰 바인딩 설정
android {
(...생략...)
buildFeatures {
viewBinding = true
}
}
- 'build.gradle 파일을 열고 android 영역에서 buildFeatures를 선언합니다.
- 그 안에 바인딩을 적용하라는 의미로 viewBinding = true로 설정합니다.
그러면 XML 파일에 등록된 뷰 객체를 포함하는 클래스가 자동으로 만들어집니다. 클래스가 자동으로 만들어진다는 것은 코드에서 뷰를 선언하고 findViewById() 함수를 호출하지 않아도 구현한 클래스가 자동으로 만들어지므로 그 클래스를 이용해서 사용하면 됩다는 것입니다. 자동으로 만들어지는 클래스의 이름은 레이아웃 XML 파일명을 따릅니다. 클래스의 이름의 형식은 첫 글자를 대문자로 하고 언더바( '_' )는 빠지고 그다음첫 글자를 대문자로 바꾸고 'Binding'을 추가합니다. / ex ) item_main.xml -> ItemMainBinding
- 자동으로 만들어진 클래스의 inflate() 함수를 호출하면 바인딩 객체를 얻을 수 있습니다. 인자는 layoutInflater를 전달하면 됩니다. =>
- 바인딩 객체의 root 프로퍼 티티에는 XML의 루트 태그 객체가 자동으로 등록되므로 액티비티 화면 출력은 setContentView() 함수에 binding.root를 전달해주면 됩니다.
// 바인딩 객체 획득
val binding = ActivityMainBinding.inflate(layoutInflater)
// 액티비티 화면 출력
setContentView(binding.root)
// 뷰 객체 이용
binding.visibleBtn.setOnClickListener { ... }
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
(생략)
tools:viewBindingIgnore="true">
특정 레이아웃 XML 파일을 바인딩 클래스로 만들고 싶지 않을 때는 XML 파일의 루트 태그에 tools:viewBindingIgnore를 true로설 정해주면XML 파일을 위한 바인딩 클래스를 만들지 않습니다.