Для других, которым могут не помочь предыдущие ответы, такие как я, проблема может заключаться в том, что вы неправильно настроили свой 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);
}
}
person
Vanheden
schedule
14.06.2020