【问题标题】:Where to put viewModel Observers in a dialogFragment?在 dialogFragment 中放置 viewModel 观察者的位置?
【发布时间】:2018-08-19 10:28:44
【问题描述】:

对于片段,将 liveData 观察者放在 onActivityCreated 方法中是 advised。这适用于片段,但是当我将其应用于 dialogFragment 时,我收到以下错误:

java.lang.IllegalStateException:当 getView() 为 null 时,即 onCreateView() 之前或 onDestroyView() 之后,无法访问 Fragment View 的 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();
            ....
}

此 Code Pattern 在片段中可以正常工作,但在 dialogFragment 中无法正常工作。在那里我必须将生命周期所有者设置为“this”。

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

【问题讨论】:

标签: android android-livedata


【解决方案1】:

更新:请参阅下面 Farid 的链接,可能不推荐此答案。

当您通过这样做覆盖onCreateDialog 时,您可以在DialogFragment 中使用ViewModels

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

然后,对话框的行为更像是一个普通的片段,您可以随意在onCreateViewonViewCreatedonActivityCreated 中观察您的ViewModel

【讨论】:

  • 一个小问题 - 我不相信 DialogFragment 曾经调用过 onViewCreated()
  • androidx.fragment.app.DialogFragment 肯定会调用onViewCreated
  • 如果您在onCreateView 中膨胀了一个布局,它将调用onViewCreated。如果您只在onCreateDialog 中提供对话框,它将不会调用onViewCreated,因为onCreateView 之前返回了null
  • @isabsent 如果onCreateDialog 被覆盖,它肯定不会调用onViewCreated。现在,你能告诉我们“肯定”是从哪里来的吗?!
  • 传递this 是正确的方法,正如在突出显示的框中(developer.android.com/guide/fragments/dialogs#lifecycle)中提到的那样
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 1970-01-01
  • 1970-01-01
  • 2014-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多