lundi 2 novembre 2020

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 everytime the fragment is extended.

For example I have this BaseFragment

open class BaseFragment(@LayoutRes contentLayoutId : Int = 0) : Fragment(contentLayoutId) {

    private lateinit var onInteractionListener: OnFragmentInteractionListener

    val toolbar : Toolbar?
        get() {
            return if(activity is BaseActivity)
                (activity as BaseActivity).toolbar
            else
                null
        }

    override fun onAttach(context: Context) {
        super.onAttach(context)
        setOnInteractionListener(context)
    }
...

In which I use like this

class A(): BaseFragment(R.layout.myFragment) { ... }

Now, if I use this I will need to do the definition of the binding class again in my onCreateView

class A(): BaseFragment(R.layout.myFragment) { 

private lateinit var binding: MyFragmentBinding

 override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        binding = DataBindingUtil.inflate(inflater, R.layout.myFragment, container, false)
        return binding.root
    }

 override fun onDestroy(){
  binding = null
 }

}

What I want to implement is that since I'm passwing the layout to my BaseFragment, I want my BaseFragment to handle the creation of the binding and just return me the binding in the fragment which I use to extend BaseFragment

What I want to have is something like this

class A(): BaseFragment(R.layout.myFragment) { 
    
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        binding.myTextView = ""
    }
 }

So my question is, how I can implement inside BaseFragment the onDestroy() and the onCreateView to always create a binding for me from the layout I'm passing in ?

I heard that I should use reflection but I'm not that sure on how to accomplish it





Aucun commentaire:

Enregistrer un commentaire