앱 비밀번호 잠금 기능을 구현하던 도중 크게 두 가지 문제가 발생했다.
- 레이아웃의 뷰를 제대로 참조하지 못함
startActivityForResult
가deprecated
되어 사용하지 못함
1번의 문제를 해결하기 위해 지금까지는 findViewById
를 사용해 왔고, 효율적인 사용을 위해 코틀린에서는 Kotlin Extension
이라는 부가 기능을 제공해 왔다. 하지만 아래와 같은 이유로 최신 버전의 안드로이드 스튜디오에서는 사용하지 않는게 좋다.
- Kotlin에서만 제공하므로 Java에서는 사용할 수 없다.
- 일부 상황에서 뷰를 찾을 수 없는 오류가 발생한다.
- 어디서나 뷰를 호출할 수 있기 때문에 잘못된 참조로 인해 앱이 강제 종료될 수 있다. 예를들어 activity_main.xml과 fragment_sub.xml에서 동일하게 button 아이디를 사용하면 실수로 다른 XML의 아이디를 참조하여 앱이 강제로 종료될 수 있는 것이다.
- 모듈화를 추천하고 있는데 Kotlin Extension을 사용할 경우 다른 모듈에서 뷰에 대한 접근이 불가능하다.
따라서 이번 포스팅에서는 ViewBinding
을 통해 뷰 참조 문제를 해결해보자.
Gradle Scripts
> build.gradle (Module: [Project Name].app)
파일을 연다.buildFeatures {
viewBinding true
}
Sync Now
를 클릭해 변경 사항을 반영해준다.뷰 바인딩은 각 XML 레이아웃 파일의 루트 뷰 및 ID가 있는 모든 뷰의 참조를 포함한 클래스를 자동으로 생성한다. 이 클래스의 이름은 XML 파일의 이름을 카멜 표기법으로 변환하고 끝에 'Binding'을 추가하여 생성된다.
ex. activity_main.xml > ActivityMainBinding
실제로 생성되었는지 확인해 보자.
Android
를 Project
로 변경하고 [Project Name] > [app] > [build] > [generated] > [data_binding_base_class_source_out]
를 열면 .java
파일 두 개가 생성되어 있는 걸 확인할 수 있다.ActivityMainBinding.java
ActivityAppLockPasswordBinding.java
setContentView
는 주석처리 했다.binding
만 붙여주면 된다.다음 포스팅에서는
startActivityForResult
문제를 해결해 보자.