对于片段,将liveData观察者放在onActivityCreated方法中advised。对于片段,这很好用,但是当我将其应用于dialogFragment时,出现以下错误:
java.lang.IllegalStateException:当getView()为null时,即在onCreateView()之前或onDestroyView()之后,无法访问片段视图的LifecycleOwner。
从这个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”。
那我为什么会收到错误消息?
答案 0 :(得分:0)
通过执行以下操作覆盖ViewModels
时,可以在DialogFragment
中使用onCreateDialog
:
onCreateDialog
中扩展自定义视图时,请将对它的引用作为变量存储在DialogFragment
中。onCreateView
,只需返回保存的自定义视图即可。onDestroyView
中的视图设置为null(否则,Leak Canary报告了内存泄漏) override fun onDestroyView() {
myView = null
super.onDestroyView()
}
然后,对话框的行为更像是普通片段,您可以根据需要在ViewModel
,onCreateView
或onViewCreated
中观察onActivityCreated
。
答案 1 :(得分:-1)
您的logcat错误为您解决了问题。您的片段视图为空。
因此,在onViewCreated()方法中使用视图模型,或者在创建视图时显示视图模型中的数据。所以视图相关的任何工作都必须用这种方法来完成。
您可以在上层生命周期中对其进行初始化,但是当用户可用视图时必须显示数据