Похоже, что всякий раз, когда вы используете метод .replace()
в транзакции с диспетчером фрагментов поддержки, ViewModel воссоздается. Это намеренно? Сам экземпляр Fragment не меняется, и ViewModel будет (частично) сохраняться при изменении ротации/конфигурации.
Я вижу следующие сценарии:
- Получить ссылку на модель представления (count = 0), обновить count = 1, повернуть, count = 1, onCreate вызвать снова и count = 0 (модель представления воссоздана).
- Вызовите
.replace()
, и модель представления будет воссоздана (экземпляры действий и фрагментов не изменились).
Использование библиотеки поддержки 26.0.0.
ViewModel
создается в onCreate
моего фрагмента и ограничен Fragment
:
viewModel = ViewModelProviders.of(this).get(DashboardViewModel::class.java)
Кто-нибудь подскажет, нормально ли это?
ViewModel
реализован как дочерний сохраненный фрагмент любыхFragmentActivity
илиFragment
, которые вы передаете вViewModelProviders.of()
. - person CommonsWare   schedule 30.07.2017fragments = mapOf(id to fragment, etc)
Затем позже:supportFragmentManager.beginTransaction().replace(R.id.fragmentContainer, fragment).commit()
Я вижу, что ссылки на фрагменты одинаковы (не воссоздаются). - person Luke   schedule 30.07.2017viewModel = ViewModelProviders.of(activity).get(DashboardViewModel::class.java)
- person Luke   schedule 30.07.2017FragmentTransaction
, запустили другую транзакцию, которая заменила его, запустили другую транзакциюreplace()
, которая вернула его... и затем вы потеряли свойViewModel
? Возможно, когда фрагмент снова управляетсяFragmentManager
, его вложенныйFragmentManager
заменяется. Я избегаю вложенных фрагментов, как чумы, поэтому я не знаю правил для дочерних фрагментов фрагмента, аViewModel
поддерживается сохраненным дочерним фрагментом вашего фрагмента. - person CommonsWare   schedule 30.07.2017