这实际上取决于你如何创建你的ViewModel
实例。现在你正在创建ViewModel
通过其构造函数,但这不是正确的方法。你应该使用ViewModelProvider
或由 Google 团队创建的扩展方法。
如果你和ViewModelProvider
你应该这样做:
TimeTableViewModel viewModel = new ViewModelProvider(this).get(TimeTableViewModel.class);
将正确的上下文传递给ViewModelProvider
构造函数调用。如果你在片段中,你只会使用getContext()
代替getActivity()
,您将不会获得与 Activity 中创建的实例相同的实例。您将创建一个新实例ViewModel
,其作用域仅在片段生命周期内。因此,在两个部分的活动上下文中使用以获得相同的实例非常重要。
活动部分:
TimeTableViewModel viewModel = new ViewModelProvider(this).get(TimeTableViewModel.class);
片段部分:
TimeTableViewModel viewModel = new ViewModelProvider(getActivity()).get(TimeTableViewModel.class);
重要的是您的片段位于使用此片段的同一活动内ViewModel
.
但谷歌的人通过一些扩展方法让我们变得更容易。但据我所知,他们只在 Kotlin 类中工作。因此,如果您有 Kotlin 代码,您可以声明您的ViewModel
就像这样:
private val quizViewModel: TimeTableViewModel by activityViewModels()
对于片段范围ViewModel
你需要写这样的东西:
private val quizViewModel: TimeTableViewModel by viewModels()
但是你必须将 Kotlin ktx 依赖项添加到你的项目中build.gradle
文件。例如这样:
implementation 'androidx.fragment:fragment-ktx:1.1.0'