반응형
findViewById & kotlin-android-extensions
자바에서는 뷰를 불러올 때 아래와 같이 findViewById()를 써야했다.
val myView = findViewById(R.id.myView)
myView.setImageResource(R.mipmap.ic_launcher)
하지만 코틀린은 아래와 같이 간결하게 쓸 수 있었다.
myView.setImageResource(R.mipmap.ic_launcher)
왜 과거형이냐면, 안드로이드 스튜디오 4.1 버전과 그 이후로는 kotlin-android-extensions 플러그인을 기본적으로 제공하지 않기 때문이다. 만약 굳이 사용하고 싶다면 build.gradle 파일에 아래와 같이 직접 추가해주면 된다.
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-android-extensions'
}
문제점
kotlin-android-extensions는 엄청나게 편리한 기능이지만, 지원이 중단되었다. 익스텐션을 사용하면 크게 두가지의 문제점이 발생할 수 있기 때문이다.
- 동일한 id를 가진 widget의 모호함
- ViewHolder의 캐싱문제
viewBinding
참조: https://developer.android.com/topic/libraries/view-binding#kotlin
viewBinding을 사용하기 위해 우선 build.gradle 파일의 android 내에 아래와 같은 코드를 추가해준다.
buildFeatures{
viewBinding true
}
그 후 inflate() 메서드를 호출해서 binding 클래스 인스턴스를 생성한다. 이때 바인딩 클래스의 이름은 XML 파일 이름을 카멜 표기법으로 변환한 뒤, Binding을 추가한 형태가 된다.
val binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
이제 binding 클래스 인스턴스를 사용해 뷰를 참조할 수 있다.
binding.name.text = viewModel.name
binding.button.setOnClickListener { viewModel.userClicked() }
반응형