반응형
시간이 좀 지난 일이지만 개발 방식을 조금 바꾸게 되어 정리해본다.
안드로이드 4.1 버전에서 새로운 프로젝트 생성 시 기본 플러그인으로 제공하던
apply plugin: 'kotlin-android-extensions'이 제거되고, 기본 'com.android.application'과 'kotlin-android'만 남게 되었음
그렇다면 왜 deprecated되었을까?
- 내부적인 캐시를 통해 재사용성을 높인 것임
- RecyclerView의 ViewHolder에서는 이 재사용성이 지켜지지 않음
- 디컴파일을 해보지 않으면 알 수 없기 때문에 상당히 많은 개발자가 놓치고 그대로 활용
< 기존의 ViewHolder >
class SampleViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun onBind() {
itemView.btn.setOnClickListener {
}
}
}
< 디컴파일한 코드>
public final void onBind() {
View var10000 = this.itemView;
Intrinsics.checkNotNullExpressionValue(var10000, "itemView");
((Button)var10000.findViewById(id.btn)).setOnClickListener((OnClickListener)null.INSTANCE);
}
_findCachedViewById를 사용하지 않고 findViewById를 사용하고 있음
== onBind()를 호출할 때마다 findViewById를 매번 하는 것
: 재사용성을 높여야 하는 RecyclerView.ViewHolder에서 이를 제공하지 않고 있음
- 실수가 생길 여지가 많음 (동일한 id를 가진 서로 다른 widget)
- 해당 레이아웃에서만 사용하는 widget만 추천하는 것이 아니라 모든 레이아웃의 widget이 추천됨
- 이런 경우에는 런타임 오류가 발생
- 실수가 생길 여지가 많음 (동일한 id를 가진 같은 widget)
- 이름만 명확하면 문제를 해결할 수 있고, 사소한 문제이지만 나중에 이슈가 터질 수도 있음
- import와 include를 사용하게 되는 경우 발생할 수 있음
- 이 경우에는 정상 동작을 함
ViewBinding
findViewById를 쓰지 않고,
XML의 view component에 접근하는 object(Android studio에서 자동 생성)를 반환받아 view에 접근하는 방식
장점
- NULL safety
- 잘못된 id를 대입하여 null pointer 오류가 발생하는 등의 문제가 일어나지 않음
- Type safety
- 바인딩 클래스 내 필드는 레이아웃 내 선언된 뷰의 타입을 갖음.
- 따라서 잘못된 타입으로 캐스팅하는 실수를 원천 봉쇄함
참고
- thdev.tech/android/2020/10/07/Remove-kotlinx-synthetic/
- tourspace.tistory.com/314
- medium.com/androiddevelopers/use-view-binding-to-replace-findviewbyid-c83942471fc
반응형
'ANDROID > Android 개발 이슈 & 해결' 카테고리의 다른 글
[Android] Text 부분 bold, color 커스텀 with Span (0) | 2021.08.31 |
---|---|
[Android] Activity Result API를 이용한 Google 로그인 (0) | 2021.08.18 |
[Android] Activity Result API : Fragment에서 registerForActivityResult() (0) | 2021.08.17 |
[Android] setOnNavigationItemSelectedListener deprecated 해결 (2) | 2021.08.03 |
[Android] startActivityForResult() deprecated 해결 : Activity Result API (0) | 2021.07.29 |
[Android] Your anti-virus program might be impacting your build performance. - Firebase 연동 오류 해결 (0) | 2021.07.27 |
[Android] image와 text가 있는 버튼(Button) (feat. 테두리 변형) (0) | 2021.07.26 |
[Android] 동적 RecyclerView와 정적 RecyclerView 연결하기 (0) | 2021.03.21 |
댓글