안녕하세요 골드입니다.
이번 글은 안드로이드에서 사용하도록 권장하는 방법 중 하나인 뷰 결합에 대한 글입니다. 뷰 결합을 사용함으로써 생산성이 다소 높아질 것이라고 생각됩니다. 뷰 결합은 기존의 개발 방식을 더 편리하게 만들어주는 하나의 도구입니다. 특히 Java로 안드로이드 개발을 하던 시절에 View에 대한 참조를 위해 findViewById를 상당히 많이 사용했었습니다. findViewById로 참조하고 형변환을 해서 사용하던 기존 방식에 대한 불편함을 View Binding이 상당 부분 해결해줍니다. 그렇기 때문에 구글에서 사용을 권장하는 방법입니다.
요약 :
구글 : 너네 findViewById 쓰니까 에러도 많고 귀찮았지? 그래서 우리가 준비했다. View Binding이라는 걸 한 번 사용해봐!
1. 사용하기
뷰 결합을 사용하기 위해 앱 모듈 build.gradle에 ViewBinding을 사용한다고 알려줍니다. View Binding은 모듈 별로 사용 설정됩니다. 사용 설정된 View Binding은 모듈에 있는 각 xml 파일에 대한 Binding 클래스를 생성합니다. 우리는 이 Binding 클래스를 사용하여 레이아웃 ID가 있는 뷰에 직접 참조 할 수 있게 됩니다.
- 만약 Binding을 사용하지 않을 xml 파일이 있다면 루트 뷰에 viewBindingIgnore 속성을 추가합니다.
예제를 위해 HomeFragment.kt와 fragment_home.xml 파일을 생성하도록 하겠습니다.
fragment_home.xml 파일입니다. ConstraintLayout을 루트로 감싸고 FragmentContainerView와 BottomNavigationView를 하나씩 선언하였습니다. 참조를 위해서는 반드시 id 속성을 선언해야 합니다. 만일 참조가 필요하지 않다면 id속성을 선언하지 않아도 됩니다.
HomeFragment.kt로 이동해서 생성된 Binding 클래스를 참조하는 변수를 선언합니다.
Binding 클래스는 카멜 표기법으로 작성한 xml 파일 이름 뒤에 Binding이 붙은 이름으로 생성됩니다. 접근할 때 사용하는 getter 변수도 하나 선언합니다(Optional). Fragment에서 사용하기 위해 onCreateView 안에서 Binding클래스 참조 변수에 inflate()를 하고 getter 변수로 접근하여 루트 뷰의 참조를 return 합니다. 가상 머신을 실행시켜보면 반환된 루트 뷰가 화면의 활성 뷰로 나타나고 있음을 확인할 수 있습니다.
이제 getter 변수로 xml에서 ID 속성을 선언한 View들을 참조할 수 있음을 확인할 수 있습니다. 참조 뷰들은 카멜 표기법으로 선언되었음을 알 수 있습니다. xml에 선언되어 있는 어떠한 View도 ID속성만 갖고 있다면 Binding 클래스를 활용하여 참조할 수 있습니다.
2. findViewById와의 차이점
앞서 View Binding은 findViewById를 대체할 수 있다고 말씀드렸습니다. 대체가 가능하다는건 위의 예제를 보면 알 수 있습니다. 그럼 구체적으로 어떤 차이점이 있는지 보겠습니다.
-
Null 안전 : ID속성값에 따른 뷰의 직접 참조를 생성하기 때문에 유효하지 않은 ID접근으로 인한 예외의 위험이 없습니다.
-
유형 안전 : Binding 클래스에 정의된 필드의 유형과 XML 파일에서 참조하는 View의 유형이 같습니다. 그렇기 때문에 불필요한 형변환을 하지 않아도 됩니다.
결과적으로 코드의 생산성을 높일 수 있다는 점이 View Binding에 가장 큰 매력으로 생각됩니다.
여기까지 골드였습니다.
감사합니다.
참고자료 : developer.android.com/topic/libraries/view-binding?hl=ko
'Mobile > Android(Kotlin)' 카테고리의 다른 글
[Android/Kotlin] Library Module 만들어서 사용하는 방법 (0) | 2021.01.15 |
---|---|
[Android/Kotlin] WebView 사용하기 (0) | 2021.01.11 |
[Android/Kotlin] Bottom Sheet Dialog Fragment 사용법 (0) | 2020.12.08 |
[Android/Kotlin] 서울시 공공데이터 사용법 (0) | 2020.12.07 |
[Android/Kotlin] Retrofit2 활용하기 (Kotlin data class File from JSON) (8) | 2020.11.26 |