안드로이드는 binding 클래스를 생성하여 XML 파일의 요소들을 참조할 수 있도록 해준다. 개발을 시작할 때부터 뷰 바인딩을 사용하여 개발했었는데, 이번에 알게된 새로운 사실도 있다.. 지금까지 착각하고 불편하게 바인딩을 사용하고 있었다... 자세히 소개하면서 내가 착각한 부분도 함께 언급하겠다!
먼저 View Binding은 binding 클래스의 instance에 상응하는 레이아웃에 id가 있는 모든 view의 직접 참조가 포함된다. 안드로이드 스튜디오에서 project 버전 보기를 선택하면 다음과 같이 binding 클래스가 생성되어 있는 것을 확인할 수 있다.
findViewById 와 다른 점은 아주아주 간단하게 말하자면 코드가 간결해진다는 점이다. 더 자세히 들어가면 null 안전과 유형 안전이 있다. null 안전은, view의 직접 참조를 생성하기 때문에 유효하지 않은 view id로 인해 null pointer exception이 발생할 위험이 없다는 의미이다. 유형안전은, 각 binding class의 필드 유형이 XML파일에서 참조하는 view와 일치해서 클래스 변환 예외 발생 위험이 없다는 뜻이다.
뷰바인딩을 사용하려면, build.gradle 파일에 다음과 같은 요소를 추가해야 한다.
android {
...
viewBinding {
enabled = true
}
}
뷰바인딩은 activity와 fragment에서 모두 사용이 가능한데, 사용방법은 조금 다르다. (나는 지금까지 fragment에서 뷰바인딩 사용을 권장하지 않는다고 착각하고 있었다. 사용법에 차이가 있을 뿐 fragment에서도 뷰바인딩 사용이 가능하다!)
activity에서는 inflate( ) 함수를 이용해 instance를 생성하고 root view 를 setContentView에 전달하여 활성 뷰로 만들어주면 설정이 완료된다.
private lateinit var binding: ResultProfileBinding
override fun onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
binding = ResultProfileBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
}
이렇게 뷰바인딩을 사용하고 난 후에 이후에 "sendBtn" 이라는 id를 가진 요소를 참조하려면 binding.sendBtn 으로 간단하게 참조가 가능하다.
fragment 에서는 activity와 전체적으로 비슷하지만 가장 큰 차이는 onDestroyView( ) 매서드가 추가된다는 것이다.
private var _binding: ResultProfileBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = ResultProfileBinding.inflate(inflater, container, false)
val view = binding.root
return view
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
fragment 는 view보다 오래 지속되기 때문에 onDestroyView( ) 매서드를 이용하여 참조를 정리해줘야 한다. 그렇게 해야 다른 에러가 발생하지 않고 안정적으로 뷰바인딩 사용이 가능하다.
Data Binding은 선언적 형식으로 레이아웃의 UI 구성요소를 앱의 데이터 소스와 결합할 수 있게 하는 Android Jetpack의 구성 요소에 해당한다. layout 태그를 통해 XML 파일에서 View에 텍스트 등을 할당할 수 있다.
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="viewmodel"
type="com.myapp.data.ViewModel" />
</data>
<ConstraintLayout... /> <!-- UI layout's root element -->
</layout>
코드 가독성이 좋아지고 간결해진다는 장점이 있지만 클래스 파일이 늘어나고 빌드 속도가 느려질 수 있다는 단점도 존재한다. 그래서 MVVM, MVP 아키텍쳐 등과 함께 사용하는 것이 권장된다. 나도 계속 사용해보고 싶었던 라이브러리지만 아직 도전해보지 못했는데, 지금의 어플 기능 구현을 끝내고 나서 한번 시도해보려 한다.
사용하는 activity에서 초기화해주고, XML 파일에서 아래와 같은 형식으로 데이터바인딩 해줄 수 있다.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding: ActivityMainBinding = DataBindingUtil.setContentView(
this, R.layout.activity_main)
binding.user = User("Test", "User")
}
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}" />
선언적 형식이라 조금 낯설게 느껴지기는 하지만 이렇게 봤을 때는 훨씬 편해보인다. 앞의 뷰바인딩처럼 build.gradle 파일에 추가해주고 난 후에 사용이 가능하다.
대부분의 안드로이드 개발자가 사용하고 있는 기술이지만, 한번 정리해보고 싶어서 바인딩에 대한 자료를 정리해봤다. 글에 사용된 예시 코드는 안드로이드 공식 문서를 참고했다.
뷰 결합 | Android 개발자 | Android Developers
뷰 결합 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 뷰 결합 기능을 사용하면 뷰와 상호작용하는 코드를 쉽게 작성할 수 있습니다. 모듈에서 사용 설정
developer.android.com
데이터 결합 라이브러리 | Android 개발자 | Android Developers
컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 데이터 결합 라이브러리 Android Jetpack의 구성요소. 데이터 결합 라이브러리는 프로그래매틱 방식이 아니라 선
developer.android.com
'Android 공부' 카테고리의 다른 글
11. 안드로이드 프로세스 & 스레드 (0) | 2023.01.16 |
---|---|
10. 코틀린 overloading & overriding (0) | 2023.01.14 |
8. 안드로이드 람다함수 (0) | 2023.01.10 |
7. 안드로이드 디자인 패턴 - MVP & MVVM (0) | 2023.01.09 |
6. 안드로이드 context (0) | 2023.01.08 |