在哪里将viewModel观察者放在dialogFragment中?

时间:2018-08-19 10:28:44

标签: android android-livedata

对于片段,将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”。

那我为什么会收到错误消息?

2 个答案:

答案 0 :(得分:0)

通过执行以下操作覆盖ViewModels时,可以在DialogFragment中使用onCreateDialog

  1. onCreateDialog中扩展自定义视图时,请将对它的引用作为变量存储在DialogFragment中。
  2. 覆盖onCreateView,只需返回保存的自定义视图即可。
  3. 完全像这样将onDestroyView中的视图设置为null(否则,Leak Canary报告了内存泄漏)
    override fun onDestroyView() {
        myView = null
        super.onDestroyView()
    }

然后,对话框的行为更像是普通片段,您可以根据需要在ViewModelonCreateViewonViewCreated中观察onActivityCreated

答案 1 :(得分:-1)

您的logcat错误为您解决了问题。您的片段视图为空。

因此,在onViewCreated()方法中使用视图模型,或者在创建视图时显示视图模型中的数据。所以视图相关的任何工作都必须用这种方法来完成。

您可以在上层生命周期中对其进行初始化,但是当用户可用视图时必须显示数据