Android 无法从活动中观察viewmodel中的livedata集
我是一个新的Android开发者,我试图从其父活动中观察ViewModel中的布尔集。我可以在应用程序启动后立即观察其初始状态,但以后应用的任何更改似乎都不会触发观察者(即,当我切换片段时) 以下是我的ViewModel的代码:Android 无法从活动中观察viewmodel中的livedata集,android,kotlin,mutablelivedata,Android,Kotlin,Mutablelivedata,我是一个新的Android开发者,我试图从其父活动中观察ViewModel中的布尔集。我可以在应用程序启动后立即观察其初始状态,但以后应用的任何更改似乎都不会触发观察者(即,当我切换片段时) 以下是我的ViewModel的代码: class MyMusicViewModel : ViewModel() { private var _MyMusicViewOn = MutableLiveData<Boolean>() val MyMusicViewOn: Live
class MyMusicViewModel : ViewModel() {
private var _MyMusicViewOn = MutableLiveData<Boolean>()
val MyMusicViewOn: LiveData<Boolean> get() = _MyMusicViewOn
init {
Timber.i("MyMusicViewModel Init Called!")
setMyMusicView(true)
}
override fun onCleared() {
super.onCleared()
Timber.i("MyMusicViewModel Cleared!")
setMyMusicView(false)
}
fun setMyMusicView(setter: Boolean) {
Timber.i("MyMusicViewModel setter called! %s", setter)
_MyMusicViewOn.value = setter
}
}
如果您想看到ViewModel的相关片段,请参见:
class MyMusicFragment : Fragment() {
private lateinit var viewModel: MyMusicViewModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val binding = DataBindingUtil.inflate<FragmentMyMusicBinding>(
inflater,
R.layout.fragment_my_music,
container,
false
)
viewModel = ViewModelProvider(this).get(MyMusicViewModel::class.java)
return binding.root
}
override fun onResume() {
super.onResume()
Timber.i("MyMusicViewFragment resumed!")
viewModel.setMyMusicView(true)
}
}
类MyMusicFragment:Fragment(){
私有lateinit var视图模型:MyMusicViewModel
覆盖创建视图(
充气器:布局充气器,容器:视图组?,
savedInstanceState:捆绑?
):查看{
//为该碎片膨胀布局
val binding=DataBindingUtil.inflate(
充气机,
R.layout.fragment_我的音乐,
集装箱,
假的
)
viewModel=ViewModelProvider(this.get)(MyMusicViewModel::class.java)
返回binding.root
}
重写onResume(){
super.onResume()
Timber.i(“我的音乐片段恢复!”)
viewModel.setMyMusicView(真)
}
}
我试图完成的是通过更改MyMusicViewen MutableLiveData布尔值的状态来观察onResume()、onCleared()和init{}函数的调用情况。我不明白的是,为什么布尔值每次更改时都不会触发父活动中的观察者集
提前感谢您的任何想法
祝你一切顺利
Fab.我猜,无论您如何在片段中填充
viewModel
属性,您都没有使用活动的viewModel实例。获取活动正在使用的同一实例的最简单方法是使用activityViewModels
委托:
private val viewModel: MyMusicViewModel by activityViewModels()
在
MyMusicFragment
中有一个lateinit var viewModel:MyMusicViewModel
,但没有包含任何设置viewModel
对象的代码。你能包括那个代码吗?你是对的,对不起,我忘了包括那个代码。我已经编辑了上面的帖子。谢谢谢谢你的回答。好的,我想这一行必须放在片段中,而不是“private-lateinit-var-viewModel:MyMusicViewModel”。我说得对吗?我这样做了,但是后来我在“viewModel=ViewModelProvider(this).get(MyMusicViewModel::class.java)”中出现了一个错误,所以我删除了这一行,没有给出任何错误,我可以运行应用程序,现在我看到变量MyMusicViewWon每次都被正确地设置为“true”,但是。。。当设置为“false”时,从不使用。有什么想法吗?您正在onCleared()
内部将其设置为false
,这意味着活动处于非活动状态,因为Livedata
是Lifecycle软件,它不会发布这些更改。是的,这是正确的。正如@rajan.kali所说,onCleared
是在与观察者的活动已分离后调用的,因此没有更多的观察者将更改记录为false。谢谢大家!现在一切都清楚了,这是有道理的。我有一个计划来处理这一切。再次非常感谢!
private val viewModel: MyMusicViewModel by activityViewModels()