【发布时间】:2021-02-26 01:08:29
【问题描述】:
我是一名新手 Android 开发人员,我正在尝试从其父项的活动中观察 ViewModel 中的布尔集。我可以在应用程序启动后立即观察其初始状态,但以后应用的任何更改似乎都不会触发观察者(即当我切换片段时)。
这是我的 ViewModel 的代码:
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
}
}
这是它父母的活动:
class FullscreenActivity : AppCompatActivity() {
private val viewModel: MyMusicViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel.MyMusicViewOn.observe(this, Observer { MyMusicViewOn ->
Timber.i("Observer called for MyMusicViewOn %s", MyMusicViewOn)
})
}
}
如果你想查看 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)
}
}
我想要完成的是观察 onResume()、onCleared() 和 init{} 函数,只要通过更改 MyMusicViewOn MutableLiveData 布尔值的状态来调用它们。我不明白的是,为什么该布尔值在更改时不会触发父活动中的观察者集。
提前感谢您的任何想法!
一切顺利,
工厂。
【问题讨论】:
-
您的
MyMusicFragment中有一个lateinit var viewModel: MyMusicViewModel,但您没有包含任何设置该viewModel对象的代码。你能包括那个代码吗? -
你说得对,对不起,我忘了包含那个代码。我已经编辑了我上面的帖子。谢谢!
标签: android kotlin mutablelivedata