对于像我这样的以前的答案可能无法帮助的其他人,问题可能是您没有使用工厂正确设置 ViewModelProvider。
在四处挖掘之后,我通过在我的活动中添加以下方法解决了我的类似问题:
protected final <T extends ViewModel> T obtainViewModel(@NonNull AppCompatActivity activity, @NonNull Class<T> modelClass) {
ViewModelProvider.AndroidViewModelFactory factory = ViewModelProvider.AndroidViewModelFactory.getInstance(activity.getApplication());
return new ViewModelProvider(activity, factory).get(modelClass);
}
然后我在我的片段中这样做了:
protected final <T extends ViewModel> T obtainFragmentViewModel(@NonNull FragmentActivity fragment, @NonNull Class<T> modelClass) {
ViewModelProvider.AndroidViewModelFactory factory = ViewModelProvider.AndroidViewModelFactory.getInstance(fragment.getApplication());
return new ViewModelProvider(fragment, factory).get(modelClass);
}
我已经有一些用于菜单目的的抽象超类,所以我将方法隐藏在那里,这样我就不必在每个活动中重复它。这就是他们受到保护的原因。我相信如果你把它们放在你需要它们的每一个活动或片段中,它们可能是私有的。
为了尽可能清楚,然后我会调用方法在我的活动中的 onCreate() 中分配我的视图模型,它看起来像这样
private MyViewModel myViewModel;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myViewModel = obtainViewModel(this, MyViewModel.class);
}
或在片段中
private MyViewModel myViewModel;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getActivity() != null) {
myViewModel = obtainFragmentViewModel(getActivity(), MyViewModel.class);
}
}