Skip to content Skip to sidebar Skip to footer

How To Implement Databinding With Reflection In Basefragment()

I'm trying to implement a BaseFragment in which I will pass the layout resource on it and it should outputs the binding to work in the fragment itself instead of need to do it ever

Solution 1:

I didn't hear about the possibility to get the databinding just from a layout, but even if it's possible, I don't think that is the recommended way, because of two reasons:

  • Reflection is slow
  • It makes things more complicated than they are.

Instead of making magic with Reflection, you could do something like this:

abstractclassBaseFragment<out VB: ViewDataBinding>(
    privateval layout: Int,
    // Other Dependencies if wanted
) : Fragment() {
    abstractval viewModel: ViewModel
    // other variables that all fragments need// This does not cause any memory leak, because you are not storing the binding property.overridefunonCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? = DataBindingUtil.inflate<VB>(inflater, layout, container, false).apply {
        lifecycleOwner = viewLifecycleOwner
        setVariable(BR.viewModel, viewModel)
    }.root
}

    overridefunonViewCreated(view: View, savedInstanceState: Bundle?) {
       // Do some basic work here that all fragments need// like a progressbar that all fragments share, or a button, toolbar etc.
    }

And then, when you still need the bindingProperty, I would suggest the following library (it handles all the onDestoryView stuff etc):

implementation 'com.kirich1409.viewbindingpropertydelegate:viewbindingpropertydelegate:1.2.2'

You can then use this like:

classYourFragment(yourLayout: Int) : BaseFragment<YourBindingClass>() {
     privateval yourBinding: YourBindingClass by viewBinding()
     overrideval viewModel: YourViewModel by viewModels()

     overridefunonViewCreated(view: View, savedInstanceState: Bundle?) {
        // do binding stuff
     }
}

Let me know if this worked for you.

Cheers

Post a Comment for "How To Implement Databinding With Reflection In Basefragment()"