Ответ 1
Когда вы вызываете FragmentTransaction.replace(...), Android эффективно выполнит последовательность FragmentTransaction.remove(...) (для всех фрагментов, добавленных в этот контейнер) и FragmentTransaction.add(...) (для предоставленного вами фрагмента). Удаление фрагмента из FragmentManager
приведет к разрушению фрагмента, и его состояние больше не будет управляться. Наиболее заметно, что при повторном добавлении фрагмента все представления будут reset. Примечание: поскольку вы повторно используете один и тот же экземпляр фрагмента, фрагмент все равно сохранит значение любых переменных экземпляра.
Одним из решений этой проблемы было бы использовать FragmentTransaction.detach(Fragment) и FragmentTransaction.attach(Fragment) при переключении. Это приведет к воссозданию представлений фрагментов (будут вызваны onDestroyView()
и onCreateView()
), но пакет состояния экземпляра будет сохранен и возвращен вам между вызовами, и поэтому состояние просмотра может быть сохранено. Это подход, используемый FragmentPagerAdapter, когда он пытается переключиться между фрагментами.
В качестве альтернативы вы можете разрешить уничтожение фрагментов, но сохранить их сохраненное состояние для них независимо. Это будет использовать меньше памяти за счет более медленного времени переключения. Методы примечания: FragmentManager.saveFragmentInstanceState(фрагмент) и FragmentManager.setInitialSavedState( Fragment.SavedState), в сочетании с добавлением/удалением. Это подход, используемый FragmentStatePagerAdapter.
Вы можете посмотреть источник для FragmentPagerAdapter и источник для FragmentStatePagerAdapter для подсказок реализации.