Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 无法从活动中观察viewmodel中的livedata集_Android_Kotlin_Mutablelivedata - Fatal编程技术网

Android 无法从活动中观察viewmodel中的livedata集

Android 无法从活动中观察viewmodel中的livedata集,android,kotlin,mutablelivedata,Android,Kotlin,Mutablelivedata,我是一个新的Android开发者,我试图从其父活动中观察ViewModel中的布尔集。我可以在应用程序启动后立即观察其初始状态,但以后应用的任何更改似乎都不会触发观察者(即,当我切换片段时) 以下是我的ViewModel的代码: class MyMusicViewModel : ViewModel() { private var _MyMusicViewOn = MutableLiveData<Boolean>() val MyMusicViewOn: Live

我是一个新的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
    }


}
如果您想看到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()