对于片段,将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()
        }
    

    然后,对话框的行为更像是普通片段,您可以随意观察ViewModelonCreateViewonViewCreated中的onActivityCreated

    10-07 19:35
    查看更多