
ViewBinding으로 BaseFragment 생성하기
ViewBinding은 UI 컴포넌트에 대한 참조를 더 쉽게 관리할 수 있게 해주는 기능입니다. ViewBinding을 사용함으로써 null 체크나 findViewById 호출의 필요성을 줄일 수 있습니다.
abstract class BaseFragmentVB<T : ViewBinding>(private val bindingFactory: (LayoutInflater) -> T) : Fragment() {
private var _binding: T? = null
protected val binding get() = _binding!!
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
_binding = bindingFactory(inflater)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initView()
}
abstract fun initView()
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
이 방식에서 BaseFragmentVB 클래스는 제네릭 타입 T를 사용하며, 이는 ViewBinding을 상속받는 타입을 의미합니다. bindingFactory는 ViewBinding 인스턴스를 생성하기 위한 팩토리 함수입니다.
DataBinding으로 BaseFragment 생성하기
DataBinding은 ViewBinding의 모든 기능을 포함하며, 더 나아가 레이아웃 파일에서 데이터와 UI 컴포넌트를 직접 연결할 수 있는 기능을 제공합니다. 이를 통해 UI 컴포넌트를 직접 조작하는 코드를 줄이고, 더 선언적인 방식으로 UI를 관리할 수 있습니다.
abstract class BaseFragmentDB<T : ViewDataBinding>(private val layoutId: Int) : Fragment() {
private var _binding: T? = null
protected val binding get() = _binding!!
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
_binding = DataBindingUtil.inflate(inflater, layoutId, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initView()
}
abstract fun initView()
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
BaseFragmentDB 클래스는 ViewDataBinding을 상속받는 제네릭 타입 T를 사용합니다. DataBindingUtil.inflate 메서드를 사용하여 레이아웃을 인플레이트하고 ViewDataBinding 인스턴스를 생성합니다. 이 방식을 사용하면 레이아웃 XML에서 데이터 바인딩을 사용하여 데이터와 UI 컴포넌트를 직접 연결할 수 있습니다.
생성 방식의 차이
- ViewBinding: ViewBinding은 bindingFactory라는 람다 함수를 통해 인스턴스를 생성합니다. 이 함수는 LayoutInflater를 매개변수로 받아 ViewBinding 인스턴스를 반환합니다. 사용자는 이 함수를 통해 특정 레이아웃에 대한 ViewBinding 클래스의 인스턴스를 생성할 수 있습니다.
_binding = bindingFactory(inflater)
- DataBinding: DataBinding은 DataBindingUtil.inflate 메서드를 사용하여 ViewDataBinding 인스턴스를 생성합니다. 이 메서드는 LayoutInflater, 레이아웃 리소스 ID, ViewGroup 컨테이너(옵션), attachToParent 여부를 매개변수로 받습니다. 이 방식은 레이아웃 파일에서 데이터 바인딩을 활성화해야 합니다.
_binding = DataBindingUtil.inflate(inflater, layoutId, container, false)
클래스 타입의 차이
- ViewBinding: ViewBinding을 상속받는 타입의 인스턴스를 사용합니다.
- DataBinding: ViewDataBinding을 상속받는 타입의 인스턴스를 사용합니다. ViewDataBinding은 ViewBinding을 상속받으며, 추가적으로 데이터 바인딩 관련 기능을 포함합니다.
반응형
'Android > Android Core' 카테고리의 다른 글
[Android/Kotlin] 안드로이드 ConstraintLayout에서 1:1 비율로 뷰 설정하기 (1) | 2024.06.10 |
---|---|
[Android/Kotlin] 안드로이드 네비게이션: NavController 찾기의 두 가지 방법 비교 (0) | 2024.05.18 |
[Android] 안드로이드의 Instrumentation 클래스 소개 (0) | 2024.05.07 |
[Android] 안드로이드에서 Rect 클래스 활용하기 (0) | 2024.05.03 |
[Android/Java] ActivityResultLauncher 및 ActivityResultContracts 활용 방법 (0) | 2024.05.02 |