반응형
kotlin extension이 지원하는 id값으로 바로 뷰 요소에 접근하는 방식이 오류가 많아서
현재 구글에서 kotlin extension의 사용을 권장하지 않고 있다.
(원래는 안드로이드 프로젝트를 새로 만들 때 자동으로 포함되어있었는데 지금은 포함되어있지 않음)
잘 쓰던 걸 권장하지 않는데는 이유가 있을 터.. 다른 방법을 사용해보자.
뷰 바인딩View Binding은?
- findViewById의 기능을 대부분의 경우 대체할 수 있음
- Gradle파일에 뷰바인딩 사용 설정을 하면 모든 XML파일 마다 바인딩 클래스를 자동으로 생성함
- 원하는 XML의 바인딩 클래스를 사용해 id값이 있는 뷰 요소에 접근할 수 있음
- id값을 갖고 있는 뷰 요소에만 접근할 수 있음!! -> 널포인터 오류 방지 가능
findViewById 에 비해 뷰 바인딩의 장점
- Null Safety : 뷰 바인딩은 id값을 가진 뷰에 대해서 직접참조를 생성하므로 유효하지 않은 뷰 id값으로 인해 null pointer exception 오류가 발생할 위험이 없다.
- 유형 안전 : 각 바인딩 클래스에 있는 필드의 유형이 XML 파일에서 참조하는 뷰와 일치한다. 즉, 클래스 변환 예외가 발생할 위험이 없다. → ?
위와 같은 이유로 런타임에서가 아니라 컴파일 시점에서 오류를 확인할 수 있다.
View Binding 사용 설정
- app수준의 build.gradle 에 아래 내용 추가 - 안드로이드 4.0이상부터 이걸로 변경되었다!
android {
...
buildFeatures { // 뷰바인딩 (안드로이드 4.0이상부터 이걸로 변경)
viewBinding = true
}
}
app수준의 build.gradle 에 아래 내용 추가
//////구버전//////
android {
...
viewBinding {
enabled = true
}
}
Activity에서 View Binding 사용하기
- 뷰바인딩을 사용할 파일의 onCreate() 메서드에서 다음을 실행한다.
- 자동으로 생성된 바인딩 클래스의 inflate() 메서드를 호출한다.
- 바인딩 클래스의 getRoot() 메서드를 호출하거나 binding.root 로 루트 뷰 참조를 가져온다.
- 루트 뷰를 setContentView()에 전달하여 화면상의 활성 뷰로 만든다.
- 이제 바인딩 클래스의 인스턴스(뷰 요소의 id값)를 사용하여 뷰를 참조할 수 있다.
MainActivity.kt 1~4번 내용
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
}
}
ActivityMainBinding 이 자동으로 생성된 바인딩 클래스 이름이다.
MainActivity.kt 5번 내용
binding.btnDate.setOnClickListener{
}
//btnDate는 id값이다.
Fragment에서 사용하기는 아래 링크 참조. >> 이후 업데이트
참고 :
안드로이드 공식 문서 https://developer.android.com/topic/libraries/view-binding
반응형
'Android' 카테고리의 다른 글
<ERROR> Cannot fit requested classes in a single dex file (0) | 2021.08.04 |
---|