Skip to content Skip to sidebar Skip to footer

How To Use Abstraction With Viewbinding With Base Activity?

I was making a base class so that all bindings for child will be set in base I have done till this abstract class BaseActivity2 : AppCom

Solution 1:

You can declare a lambda property in the constructor to create the binding object

abstractclassBaseActivity<B : ViewBinding>(val bindingFactory: (LayoutInflater) -> B) : AppCompatActivity() {
    privatelateinitvar binding: B

    overridefunonCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = bindingFactory(layoutInflater)
        setContentView(binding.root)
    }
}

You can also define binding as lazy property

privateval binding: B by lazy { bindingFactory(layoutInflater) }

Then you need to override nothing in your activities

classMainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::inflate)

Solution 2:

Other answer will also solve problem but I would like to do in a clean way.

My Base Class

abstractclassBaseVMActivity<VM : ViewModel, B : ViewBinding> : BaseActivity() {

    lateinitvar viewModel: VM
    lateinitvar binding: B


    overridefunonCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewModel = ViewModelProvider(this, factory).get(getViewModelClass())
        binding = getViewBinding()
        setContentView(binding.root)
    }

    privatefungetViewModelClass(): Class<VM> {
        val type = (javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[0]
        return type as Class<VM>
    }

    abstractfungetViewBinding(): B

}

My activity:

classMainActivity : BaseVMActivity<AppViewModel, ActivityMainBinding>() {
    overridefungetViewBinding() = ActivityMainBinding.inflate(layoutInflater)
   
}

Now I can directly access viewModel or binding:

fundummy(){
        binding.bvReport.text = viewModel.getReportText()
    }

Post a Comment for "How To Use Abstraction With Viewbinding With Base Activity?"