有两种方法,简单的一种:
在viewModel中通过传入的view获得context来实现:
class MainActivityVM { 。。。 fun onClick(view: View) { val context = view.context val intent = Intent(context, RecycleViewActivity::class.java) context.startActivity(intent) } 。。。 }
xml:
android:onClick="@{(v) -> mainActivityVM.onClick(v)}"
第二种通过回调,这种方法比较复杂:
首先声明一个DataBindingUtils:
class DataBindingUtils { companion object { var commonMap = ArrayMap<BaseActivity, ArrayMap<Observable, Observable.OnPropertyChangedCallback>>() fun addCallBack(baseActivity: BaseActivity, observable: Observable?, callback: Observable.OnPropertyChangedCallback){ var callbackArrayMap = commonMap[baseActivity] if (callbackArrayMap == null) { callbackArrayMap = ArrayMap() commonMap[baseActivity] = callbackArrayMap } observable?.addOnPropertyChangedCallback(callback) callbackArrayMap[observable] = callback } fun removeCallBack(activity: BaseActivity) { var callbackArrayMap = commonMap[activity] if (callbackArrayMap != null) { for (observable in callbackArrayMap.keys) { observable.removeOnPropertyChangedCallback(callbackArrayMap[observable]) } } } } }
然后在MainActivity中调用:
private fun addCallBack() { DataBindingUtils.addCallBack( this, mainActivityVM?.goToSimple, object : Observable.OnPropertyChangedCallback() { override fun onPropertyChanged(p0: Observable?, p1: Int) { goToNext() } }) } fun goToNext() { startActivity<RecycleViewActivity>() }
接着在viewModel中创建一个回调通知:
class MainActivityVM { var goToSimple = ObservableInt() fun goToNext(view: View) { //view这个值看似没有引用,但是不能删去,删去会报错,可能 和onClicked(view)对应 goToSimple.notifyChange() } 。。。
最后在xml中:
android:onClick="@{mainActivityVM::goToNext}"
参考:
1.复杂方法:https://www.jianshu.com/p/564bb7f21fcc
2.Best Practice:https://stackoverflow.com/questions/40475334/best-practice-for-android-mvvm-startactivity