Search code examples
androidkotlinviewmodelandroidxandroid-mvvm

BaseFragment with viewbinding in android


  • I have created a BaseFragment to inflate other fragment's layout using view binding.
  • I have setup everything but getting an issue mViewBinding is not initialized. Guide me in the right direction.

BaseFragment.kt:

abstract class BaseFragment<VM : ViewModel, VB : ViewBinding> : Fragment() {

    protected abstract val mViewModel: VM
    protected lateinit var mViewBinding: VB

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        mViewBinding = getViewBinding(inflater, container)
        return mViewBinding.root
    }

    abstract fun getViewBinding(inflater: LayoutInflater, container: ViewGroup?): VB
}

DemoFragment.kt:

class DemoFragment : BaseFragment<DemoBaseViewModel, FragmentDemoBinding>() {

    override val mViewModel: DemoBaseViewModel by viewModels()

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
    ): View? {
        return mViewBinding.root
    }

    override fun getViewBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentDemoBinding {
        return FragmentDemoBinding.inflate(inflater, container, false)
    }
}

Solution

  • With a design like this, your derived class onCreateView() should call to base class super.onCreateView() where the binding is initialised.

    Or as Primož Ivančič points out, you don't need to override onCreateView() at all.