[안드로이드/Kotlin] findViewById 대신 ViewBinding 사용하기

토시·2022년 5월 4일
1

[Project] 개인공부

목록 보기
10/15
post-thumbnail

앱 비밀번호 잠금 기능을 구현하던 도중 크게 두 가지 문제가 발생했다.

  1. 레이아웃의 뷰를 제대로 참조하지 못함
  2. startActivityForResultdeprecated 되어 사용하지 못함

1번의 문제를 해결하기 위해 지금까지는 findViewById 를 사용해 왔고, 효율적인 사용을 위해 코틀린에서는 Kotlin Extension 이라는 부가 기능을 제공해 왔다. 하지만 아래와 같은 이유로 최신 버전의 안드로이드 스튜디오에서는 사용하지 않는게 좋다.

  1. Kotlin에서만 제공하므로 Java에서는 사용할 수 없다.
  2. 일부 상황에서 뷰를 찾을 수 없는 오류가 발생한다.
  3. 어디서나 뷰를 호출할 수 있기 때문에 잘못된 참조로 인해 앱이 강제 종료될 수 있다. 예를들어 activity_main.xml과 fragment_sub.xml에서 동일하게 button 아이디를 사용하면 실수로 다른 XML의 아이디를 참조하여 앱이 강제로 종료될 수 있는 것이다.
  4. 모듈화를 추천하고 있는데 Kotlin Extension을 사용할 경우 다른 모듈에서 뷰에 대한 접근이 불가능하다.

따라서 이번 포스팅에서는 ViewBinding을 통해 뷰 참조 문제를 해결해보자.

Gradle Scripts 설정

  1. Gradle Scripts > build.gradle (Module: [Project Name].app) 파일을 연다.

  1. 아래와 같은 코드를 추가해 준다.
buildFeatures {
	viewBinding true
}

  1. 우측 상단의 Sync Now를 클릭해 변경 사항을 반영해준다.

뷰 바인딩 파일 자세히 보기

뷰 바인딩은 각 XML 레이아웃 파일의 루트 뷰 및 ID가 있는 모든 뷰의 참조를 포함한 클래스를 자동으로 생성한다. 이 클래스의 이름은 XML 파일의 이름을 카멜 표기법으로 변환하고 끝에 'Binding'을 추가하여 생성된다.

ex. activity_main.xml > ActivityMainBinding

실제로 생성되었는지 확인해 보자.

  1. 좌측 상단의 AndroidProject 로 변경하고 [Project Name] > [app] > [build] > [generated] > [data_binding_base_class_source_out] 를 열면 .java 파일 두 개가 생성되어 있는 걸 확인할 수 있다.
  1. 각 바인딩 파일 내부에는 뷰의 ID를 참조한 클래스가 생성되어 있다.
  • ActivityMainBinding.java

  • ActivityAppLockPasswordBinding.java

액티비티와 바인딩(연결)하기

  1. MainActivity.kt로 돌아와 아래와 같은 코드를 작성한다. 기존의 setContentView는 주석처리 했다.
  1. 이제 뷰 바인딩 처리가 완료되어 자유롭게 뷰의 ID를 참조할 수 있다. 기존에 참조하려고 했던 ID의 앞에 binding만 붙여주면 된다.

다음 포스팅에서는 startActivityForResult 문제를 해결해 보자.

Reference

profile
개발하는 토시

0개의 댓글