이번 포스팅에서는 View Binding을 사용하는 법에 대해 알아보도록 하겠습니다.
Kotlin Android Extensions의 지원 중단
안드로이드 스튜디오에서는 뷰를 만들고 그 뷰를 불러오기 위해서 findViewById를 사용합니다. 이 때 kotlin-android-extensions 플러그인을 사용하면 이 함수의 사용을 생략하고 간편하게 코드를 작성할 수 있습니다.
문제는 서로 다른 xml파일을 만들었을 때 Id를 동일하게 사용할 수 있기 때문에 코드에서 헷갈릴 수 있다는 문제가 있습니다. 그래서 구글에서는 안드로이드 스튜디오 4.1부터 kotlin-android-extensions의 지원을 중단하고 View Binding을 사용하도록 안내하고 있습니다.
View Binding의 구조
View Binding을 프로젝트에서 사용하도록 설정하면 각 레이아웃 xml 파일에 대해 ViewBinding 클래스를 상속받는 개별 binding class가 자동으로 생성됩니다. 이 때 클래스 이름은 레이아웃 파일 이름을 파스칼 표기법으로 변환하고 Binding 접미사를 추가합니다.
그리고나서 onCreate
안에서 View Binding 클래스에 인스턴스를 생성하면 뷰의 Id를 인스턴스의 프로퍼티로 사용할 수 있게 됩니다.
View Binding의 장점
구글에서 설명하는 View Binding의 장점은 두가지가 있습니다. 하나는 Null-safe
로, 서로 다른 레이아웃에 대해 같은 ID를 가진 뷰를 정확히 구분할 수 있게 됩니다. 만약 Id를 참조할 수 없을 경우 @Nullable
로 만들어 아예 사용할 수 없게 막습니다. 두번째는 Type-safe
로, findViewById를 사용할 경우 뷰에 잘못된 타입을 지정할 수 있다는 문제가 있는데, View Binding에서는 그런 문제가 발생하지 않는다는 특징이 있습니다.
findViewById 사용상의 문제
안드로이드 스튜디오의 Create new project에서 Basic Activity를 만들어서 View Binding 환경을 구현해 보겠습니다. 우선은 findViewById를 사용할 때 어떤 문제가 발생하는지 보여드리겠습니다.
kotlin-android-extensions 플러그인을 적용한 뒤, fragment_first.xml
, fragment_second.xml
의 텍스트뷰 Id를 동일하게 지정해줍니다.
이 상태에서 FirstFragment.kt
에서 텍스트뷰를 사용하면 연결된 xml이 자동으로 임포트 되는데, 코드만 봐서는 이게 fragment_first.xml
에서 온 코드인지 fragment_second.xml
에서 온 것인지 알 수가 없습니다.
참조한 뷰가 한개일 때는 import 파트를 보면 출처를 알 수 있지만 사용하는 뷰가 많아지면 어떤 뷰가 어떤 import를 참조한 것인지 한눈에 파악하는 것이 매우 어려워지게 되는 문제가 있습니다.
Activity에 View Binding 적용
다음과 같이 gradle에서 View Binding을 활성화하면 모든 레이아웃 xml 파일에 대해 바인딩클래스가 생성됩니다.
|
|
우선은 메인액티비티에 적용해보겠습니다. 자동으로 생성된 ActivityMainBinding 타입의 binding 전역변수를 준비하고 onCreate
에서 inflate시킵니다.
그러면 View Binding을 사용할 수 있게 되므로 기존에 R.layout.activity_main
를 전달하던 setContentView
에 binding.root
를 전달합니다. 또 findViewById를 사용하던 setSupportActionBar
에 전달하는 값도 binding.toolbar
로 변경합니다. 플로팅버튼은 binding.fab
로 사용할 수 있습니다.
참고로 onCreateOptionsMenu
, onOptionsItemSelected
안의 내용은 findViewById()가 아니라 findItem()이라는 메소드를 사용하는것이기 때문에 View Binding으로 대체를 할 수 없습니다.
|
|
Fragment에 View Binding 적용
다음은 Fragment에 View Binding을 적용해 보겠습니다. Fragment에서 사용할 때는 _binding
과 binding
변수 두개를 만들어줍니다. _binding
은 Fragment를 사용하지 않을 때 자원을 반환할 수 있도록 Nullable 형태로 준비합니다. 그리고 실제로 사용하는 binding
은 _binding
이 초기화 되었을 때 get()
으로 값을 가져오도록 합니다.
Fragment의 라이프사이클을 고려해 _binding
을 onCreateView
안에서 초기화하면 binding
이 자동으로 생성됩니다. 그러면 binding.root
를 뷰로 반환하여주고, onViewCreated
에서는 binding
의 프로퍼티로써 텍스트뷰와 버튼을 사용하면 됩니다.
마지막으로 onDestroyView
에서는 Fragment가 어떠한 이유로 파괴될 때 _binding
을 null로 만들어서 자원을 반환하도록 합니다.
|
|
SecondFragment의 내용은 FirstFragment와 동일하므로 생략하겠습니다. 이렇게 해서 프로젝트의 액티비티와 Fragement에 View Binding을 적용하는 법에 대해 알아보았습니다.