레이아웃에서 생성한 View 는 findViewById() 를 이용해 가져온다. 그런데 하나하나 View 를 가져오는 것은 매우 귀찮은 일이다. 이때 뷰 바인딩을 사용할 수 있다.
레이아웃 xml 파일에 선언한 View 객체를 코드에서 쉽게 이용하는 방법이다.
우선, 뷰 바인딩을 사용하려면 gradle 파일에 아래와 같이 선언해야 한다. 이렇게 하면 레이아웃 xml 파일에 등록된 뷰 객체를 포함하는 클래스가 자동으로 만들어진다. 즉, findViewById() 함수를 사용하지 않고 자동으로 만들어진 클래스를 이용해 뷰를 사용하면 된다.
android{
viewBinding{
enabled = true
}
}
자동으로 만들어지는 클래스의 이름은 아래 규칙으로 작성된다.
클래스의 inflate() 함수를 이용하면 바인딩 객체를 얻을 수 있다. 이때 인자로 layoutInflater를 전달한다. 그리고 바인딩 객체의 root property에는 xml의 루트 태그가 자동으로 등록되므로 액티비티 화면 출력은 setContentView() 함수에 binding.root를 전달하면 된다.
class SongActivity : AppCompatActivity() {
lateinit var binding : ActivitySongBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// binding 초기화 (<- binding 객체 획득)
binding = ActivitySongBinding.inflate(layoutInflater)
// 액티비티 화면에 출력
setContentView(binding.root)
// 뷰 객체 이용
binding.songDownIb.setOnClickListener {
finish()
}
binding.songMiniplayerIv.setOnClickListener {
setPlayerStatus(false)
}
binding.songPauseIv.setOnClickListener{
setPlayerStatus(true)
}
}
}
xml 코드에
<ImageView
android:id = "@+id/songDownIb"
/>
이렇게 표기했다면 바인딩 객체에 songDownIb 라는 프로퍼티로 등록이 되어서 binding.songDownIb 로 접근할 수 있다.
build.gradle 에서 뷰 바인딩을 사용하겠다고 선언할 수 있다. 이때 뷰 바인딩이 필요없는 xml 파일들은 최상위 루트에 tools:viewBindingIgnore="true"라는 속성을 추가하면 이 xml 파일에 해당하는 바인딩 객체를 생성하지 않는다.