Это действительно зависит от того, как вы создаете свой экземпляр ViewModel. Теперь вы создаете ViewModel по его конструктору, но это не совсем правильно. Вы должны использовать ViewModelProvider или методы расширения, которые были созданы командой Google.
Если вы go используете ViewmodelProvider, вы должны сделать это следующим образом:
TimeTableViewModel viewModel = new ViewModelProvider(this).get(TimeTableViewModel.class);
Важно передать правильный контекст в вызов метода of
. Если вы находитесь во фрагменте и просто используете getContext()
вместо getActivity()
, вы не получите тот же экземпляр, который был создан в Activity. Вы создадите новый экземпляр ViewModel, который будет ограничен только внутри жизненного цикла фрагмента. Поэтому важно использовать в контексте действий обеих частей один и тот же экземпляр.
Часть действия:
TimeTableViewModel viewModel = new ViewModelProvider(this).get(TimeTableViewModel.class);
Часть фрагмента:
TimeTableViewModel viewModel = new ViewModelProvider(getActivity()).get(TimeTableViewModel.class);
Важно, чтобы ваш фрагмент находится внутри того же действия, что и эта ViewModel.
Но ребята из Google упростили нам некоторые методы расширения. Но насколько я знаю, они работают только в 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'