我有MVVM单一活动应用程序,任务每x分钟运行一次。
在Activity
中,我正在观察该任务的结果。一切正常。
导航到某些Fragment
之后,我想停止在Activity
中观察它,而导航到另一个Fragment
之后,再次观察(在活动中)。
观察活动的代码
settingsViewModel.pb.observe(this, Observer {
pb.visible(it)
})
希望我已经把问题弄清楚了
答案 0 :(得分:0)
为什么不改变观察者,而是在Activity上观察,如果该片段可见,则从Activity中对其进行更新。像这样:
settingsViewModel.pb.observe(this, Observer {
if (currentFrag is yourFragment) {
// currentFrag.doSomething()
} else {
pb.visible(it)
}
})
编辑1:
看看您的导航片段的primaryNavigationFragment属性,您可以在那里找到对其的引用:
val navHost = supportFragmentManager.findFragmentById(R.id.main_nav_fragment)
navHost?.let { navFragment ->
navFragment.childFragmentManager.primaryNavigationFragment?.let {currentFrag->
// currentFrag.doSomething()
}
}
}
答案 1 :(得分:0)
您可以删除活动生命周期的所有观察者
settingsViewModel.pb.removeObservers(mActivity)
它将删除该实时数据的所有观察者。当再次移动到另一个片段时,您可以像执行操作一样设置新的观察者
settingsViewModel.pb.observe(this, Observer {
pb.visible(it)
})
答案 2 :(得分:0)
首先使用SharedViewModel
在所有片段中建立视图模型,并观察所需每个片段中的实时数据。
然后在观察到livedata
时调用您的活动方法。
fragment1 {
sharedViewModel.pb.observe(viewLifecycleOwner, Observer {
activityCallBack.someMethod()
})
}
fragment2 {
sharedViewModel.pb.observe(viewLifecycleOwner, Observer {
activityCallBack.someMethod()
})
}
答案 3 :(得分:0)
您需要做的就是
override fun onDestroyView() {
super.onDestroyView()
viewModel.request.removeObservers(this)
}