본문 바로가기
Android

[Android/Kotlin] BaseFragment를 ViewBinding과 DataBinding 방식으로 생성하는 방법

by quessr 2024. 5. 13.

 

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 상속받으며, 추가적으로 데이터 바인딩 관련 기능을 포함합니다.