对于片段,将liveData观察者放在onActivityCreated方法中是advised。这对于片段工作正常,但是当我将其应用于dialogFragment时,出现以下错误:
从此question中,我读取了dialogFragment的生命周期,其创建时是:
onAttach
onCreate
onCreateDialog
onCreateView
onActivityCreated
onStart
onResume
因此,将观察者置于onActivityCreated应该没问题,就像在onCreateView或onCreateDialog之后一样。我使用后者,因为我在自己的布局中使用Alertdialog。
这是我的观察者的代码:
mScheduleViewModel.getTeachers().observe(getViewLifecycleOwner(), new Observer<List<String>>() {
@Override
public void onChanged(@Nullable List<String> strings) {
mStringList = strings;
aclInputvalue.setThreshold(2);
aclAdapter.setList(strings);
aclAdapter.notifyDataSetChanged();
....
}
此代码模式在片段中可以正常工作,而在dialogFragment中则不能。在那里,我必须将lifecycleOwner设置为“this”。
那么,为什么我会收到错误消息?
最佳答案
当您通过以下操作覆盖ViewModels
时,可以在DialogFragment
中使用onCreateDialog
:
onCreateDialog
中扩展自定义 View 时,请将对它的引用作为变量存储在DialogFragment
中。 onCreateView
并仅返回您保存的自定义 View 。 onDestroyView
中将 View 设置为null(否则,Leak Canary报告内存泄漏) override fun onDestroyView() {
myView = null
super.onDestroyView()
}
然后,对话框的行为更像是普通片段,您可以随意观察
ViewModel
,onCreateView
或onViewCreated
中的onActivityCreated
。