모듈에 있는 각 xml 레이아웃 파일에 대한 결합클래스를 생성. 바인딩 클래스의 인스턴스에는 상응하는 레이아웃에 ID가 부여된 모든 뷰에 대한 직접 참조가 포함됨.
아래와 같이 app의 build.gradle 파일에 선언해주면 사용할 수 있음
android {
...
viewBinding {
enabled = true
}
}
생성된 결합 클래스에는 xml에서 id 가 부여된 뷰에 대해서만 참조가 생성되며 없는 뷰는 생성되지 않는다. 또한 상응하는 레이아웃 파일의 루트뷰에 대한 직접 참조를 제공하는 getRoot 메서드가 포함됨.
특징은 다음과 같다
findViewById와의 차이점
DataBinding과의 비교
1. ViewBinding은 보다 단순한 사례를 처리하기 위한것
안드로이드 공식문서에는 Fragment에서의 ViewBinding사용법을 아래와 같은 샘플코드로 제시한다
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는 Fragment라이프사이클과 view의 라이프사이클이 다르다.
정확히는 view의 라이프사이클리 서브셋이 되어 뷰보다 Fragment의 인스턴스가 더 오래 지속되기 때문에 적절한 시점(보통 onDestroyView)에서 참조를 처리하지 않으면 메모리 누수가 발생할 가능성이 있다.
그렇기에 구글은 참조를 nullify하는 코드를 onDestroyView에 작성하고 있다.
이렇게 변수를 두개 생성하고 매번 null을 해주는 코드를 작성하기는 귀찮으므로, 다음과 같은 해결 방법들이 있다.
private var binding by autoCleared<FragmentVideoItemBinding>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentVideoItemBinding.inflate(LayoutInflater.from(requireContext()), container, false)
return binding.root
}
어떤 방법을 사용하든 어쨌든 Fragment의 생명주기는 유심히 살펴보아야 한다!
https://developer.android.com/topic/libraries/view-binding?hl=ko
https://yoon-dailylife.tistory.com/57w