无法从 activity 观察视图模型中的实时数据集

Unable to observe livedata set in viewmodel from activity

我是一名新手 Android 开发人员,我正在尝试从其父 activity 观察 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
    }


}

这是其父级的 activity:

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)

    }




}

我想要完成的是在通过更改 MyMusicViewOn MutableLiveData 布尔值的状态调用 onResume()、onCleared() 和 init{} 函数时观察它们。我不明白的是,为什么那个布尔值在更改时不会触发父 activity 中设置的观察者。

提前感谢您的任何想法!

祝一切顺利,

很棒

我猜测无论您在 Fragment 中填充 viewModel 属性,您都没有使用 Activity 的 ViewModel 实例。获取 Activity 使用的相同实例的最简单方法是使用 activityViewModels 委托:

private val viewModel: MyMusicViewModel by activityViewModels()