View Binding 기능을 사용하면 View와 상호작용하는 코드를 쉽게 작성 가능.
모듈에서 사용 설정된 View Binding 은 모듈에 있는 각 XML 레이아웃 파일의 결합 클랫를 생성.
Binding Class의 Instance에는 상응하는 Layout에 ID가 있는 모든 뷰의 직접 참조가 포함.
설정
뷰 결합은 모듈별로 사용 설정된다. 모듈에서 뷰 결합을 사용 설정하려면 다음과 같이 viewBinding 요소를 build.gradle 파일에 복사한다.
android {
...
viewBinding {
enabled = true
}
}
Binding Class를 생성하는 동안 레이아웃 파일을 무시하려면 tools:viewBindingIgnore = "true" 속성을 레이아웃 파일의 루트뷰에 추가하라.
<LinearLayout
...
tools:viewBindingIgnore="true" >
...
</LinearLayout>
사용법
상기 설정 이후 각 XML 레이아웃 파일의 Binding Class가 생성된다. 각 Binding Class에는 루트 뷰 및 ID가 있는 모든 뷰의 참조가 포함된다.
Binding Class의 이름은 XMl파일의 이름을 카멜 표기법으로 변환하고 끝에 'Binding'을 추가하여 생성된다.
Ex) 레이아웃 파일 이름이 result_profile.xml 이면 생성된 Binding Class 이름은 ResultProfileBinding이 된다.
Activity에서의 ViewBinding 사용
Activity에 사용할 ViewBinding Class 인스턴스를 설정하려면 onCreate() 메소드에서 설정한다.
1. 생성된 Binding Class에 포함된 정적 inflate() 메소드를 호출한다. 그러면 Activity에서 사용할 Binding Class 인스턴스가 생성된다.
2. getRoot() 메소드를 호출하거나 Kotlin 속성 구문을 사용하여 루트 뷰 참조를 가져온다.
3. 루트 뷰를 setContentView()에 전달하여 화면상의 활성 뷰로 만든다.
private lateinit var binding: ResultProfileBinding
override fun onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
binding = ResultProfileBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
}
이후 Binding Class 인스턴스를 사용하여 뷰를 참조할 수 있다.
binding.name.text = viewModel.name
binding.button.setOnClickListener { viewModel.userClicked() }
Fragment에서 ViewBinding 사용
Fragment에 사용할 BindingClass 인스턴스를 설정하려면 Fragment의 onCreateView() 메소드에서 설정한다.
1. 생성된 Binding Class에 포함된 정적 inflate() 메소드를 호출한다. 그러면 Fragment에서 사용할 Binding Class 인스턴스가 생성된다.
2. getRoot() 메소드를 호출하거나 Kotlin 속성 구문을 사용하여 루트 뷰 참조를 가져온다.
3. onCreateView()메소드에서 루트 뷰를 반환하여 화면상의 활성 뷰로 만든다.
* inflate() 메소드를 사용하려면 Layout Inflater를 전달해야 한다. 레이아웃이 이미 확장되어 있다면 Binding Class의 bind() 메소드를 호출하면된다.
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
}
이후 Binding Class 인스턴스를 사용하여 뷰를 참조할 수 있다.
binding.name.text = viewModel.name
binding.button.setOnClickListener { viewModel.userClicked() }
* Fragment는 View보다 오래 지속된다. Fragment의 onDestroyView() 메소드에서 결합 클래스 인스턴스 참조를 정리해야 한다.
class BindFragment : Fragment(R.layout.fragment_blank) {
// Scoped to the lifecycle of the fragment's view (between onCreateView and onDestroyView)
private var fragmentBlankBinding: FragmentBlankBinding? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val binding = FragmentBlankBinding.bind(view)
fragmentBlankBinding = binding
binding.textViewFragment.text = getString(string.hello_from_vb_bindfragment)
}
override fun onDestroyView() {
// Consider not storing the binding instance in a field, if not needed.
fragmentBlankBinding = null
super.onDestroyView()
}
}
findViewById와의 차이점
View Binding에는 findViewById를 사용하는 것에 비해 다음과 같은 중요한 장점이 있다.
1. Null Safety: View Binding 은 View의 직접 참조를 생성하므로 유효하지 않은 View ID로 인해 null pointer exception이 발생할 위험이 없다. 또한 레이아웃의 일부 구성에만 뷰가 있는 경우 Binding Class에서 참조를 포함하는 필드가 @Nullable로 표시된다.
2. Type Safety: 각 Binding Class에 있는 필드의 유형이 XML 파일에서 참조하는 뷰와 일치하다. 즉, 클래스 변환 예외가 발생할 위험이 없다.
=> 이러한 차이점은 레이아웃과 코드 사이의 비호환성으로 인해 런타임이 아닌 컴파일 시간에 빌드가 실패하게 된다는 것을 의미한다.
Data Binding과 비교
View Binding과 Data Binding은 모두 뷰를 직접 참조하는데 사용할 수 있는 Binding Class를 생성한다. 하지만 View Binding은 보다 단순한 사용 사례를 처리하기 위한 것이며 Data Binding에 비해 다음과 같은 이점을 제공한다.
1. 더 빠른 컴파일: View Binding에는 주석 처리가 필요하지 않으므로 컴파일 시간이 더 짧다.
2. 사용 편의성: View Binding에는 특별히 태그된 XML 레이아웃 파일이 필요하지 않으므로 앱에서 더 신속하게 채택할 수 있다. 모듈에서 View Binding을 사용 설정하면 모듈의 모든 레이아웃에 View Binding이 자동으로 적용된다.
반대로 View Binding 에는 Data Binding과 비교할 때 다음과 같은 제한사항이 있다.
1. View Binding Layout variables 또는 Layout expression을 지원하지 않으므로 XML 레이아웃 파일에서 직접 dynamic UI 콘텐츠를 선언하는데 사용할 수 없다.
2. View Binding 은 two-way Data Binding을 지원하지 않는다.
* 위 사항을 고려할 때 일부 사례에서 프로젝트에 View Binding과 Data Binding을 모두 사용하는 것이 가장 좋다. 고급 기능이 필요한 레이아웃에는 Data Binding을, 고급 기능이 필요 없는 레이아웃에는 View Binding을 사용할 수 있다.
'Computer engineering > Android Programming' 카테고리의 다른 글
3. Architecture Component UI Layer Data Binding_2 (0) | 2022.07.10 |
---|---|
2. Architecture Component UI Layer Data Binding_1 (0) | 2022.07.10 |
5. Android App Architecture Data Layer (0) | 2022.07.10 |
4. Android App Architecture Domain Layer (0) | 2022.07.09 |
3. Android App Architecture UI Event (0) | 2022.07.09 |