有两种方法,简单的一种:
在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
本文介绍了两种使用Databinding在Android中实现onClick触发页面跳转的方法:一种是在ViewModel中通过view获取context,另一种是利用回调机制。详细步骤包括DataBindingUtils的创建、在MainActivity中的调用,以及在ViewModel中设置回调通知。参考链接包含详细实践和最佳实践讨论。
867

被折叠的 条评论
为什么被折叠?



