我将首先描述我想要实现的目标:
我有一个包含片段的活动。现在,根据一些操作,活动将调用FragmentManager并替换相同类型的全新片段。
在我的fragment类中,我有一个关联的ViewModel。在片段onCreateView((中,我订阅了ViewModel中的LiveData组件。
我在应用程序的整个生命周期中实例化了许多这样的片段,但如上所述,在任何给定时刻,只有一个片段是活动的。
我的问题是,我是否保证在调用getSupportFragmentManager().replace(id, new MyFrag())
时,它将停止观察当前活动(即将被替换(片段中LiveData的变化,而new MyFrag()
将是唯一的观察者?
我的第二个要求是,在调用replace()
后,我需要知道片段是何时附加的,我如何确保这一点?(注意,我不想覆盖onAttach((,我想在调用replace
后知道这一点(
编辑: 我要完整地描述我的用例
我需要一次初始化数据,并由我的Fragment进行观察。
让我解释一下:
我有一个父活动,它有一个加载一些数据的ViewModel。此数据是我的Fragment所需要的,并且仅在第一次创建Fragment时才需要。我所做的是在我的Fragment中设置观察者,它只是观察父活动的LiveData中的变化。因此,在我创建片段后,我需要立即初始化该数据,并且只初始化一次,因此我调用了在与父活动相关的VM中加载该数据的函数。但是,由于我的片段还没有附加,数据只是丢失了,因为我的观察者只有在片段不仅被创建而且被附加时才开始观察。
现在,您可能会说,只需在Fragments ViewModel构造函数中初始化该数据,但我不能这样做,因为它依赖于只有父活动VM拥有的另一个关键数据段。
我希望我很清楚,任何指导都会有所帮助,谢谢!
与其在onCreate
中获取视图模型并订阅它,不如在onCreateView
中进行,并使用viewLifecycleOwner
作为生命周期所有者。这样可以确保当视图被破坏时,所有观察者都会同时被删除。
如果使用this
(片段(作为生命周期所有者,则只有当片段被销毁时,才会删除观察者。假设您使用后堆栈,替换碎片不会立即破坏它。但这种观点肯定会被摧毁。
至于第二个问题,我真的不是碎片生命周期的专家,但你能在这里使用onCreate
或onCreateView
吗?你的情况如何?