1-й способ Создайте метод abstarct в Base Activity. Таким образом, вы должны переопределить метод abstarct во всех действиях.
abstract class BaseActivity< ViewModel : BaseViewModel,Binding : ViewDataBinding> : AppCompatActivity(){
protected lateinit var binding: Binding
private var mViewModel: V? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
performViewModelBinding()
}
@LayoutRes
abstract fun getLayoutResId(): Int
abstract fun getViewModel(): ViewModel
private fun performViewModelBinding() {
binding = DataBindingUtil.setContentView(this, getLayoutResId())
this.mViewModel = mViewModel ?: getViewModel()
binding.setVariable(BR.viewModel, mViewModel)
binding.executePendingBindings()
}
}
И когда вы переопределите этот метод вдеятельность
override fun getViewModel(): MyProfileViewModel {
mMyProfileViewModel = ViewModelProviders.of(this, mViewModelFactory).get(MyProfileViewModel::class.java)
return mMyProfileViewModel
}
2-й способ сделать это
abstract class BaseActivity<VIEW_MODEL : ViewModel, BINDING : ViewDataBinding> :
AppCompatActivity() {
lateinit var viewmodel: VIEW_MODEL
lateinit var binding: BINDING
lateinit var glide: RequestManager
@get:LayoutRes
abstract val layoutResource: Int
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, layoutResource)
viewmodel = ViewModelProviders.of(this).get(getViewModelClass())
}
private fun getViewModelClass(): Class<VIEW_MODEL> {
val type = (javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[0] // index of 0 means first argument of BaseActivity class param
return type as Class<VIEW_MODEL>
}
}