У меня довольно большая проблема, и я не совсем понимаю, что происходит. Я разрабатываю приложение, которое использует Fragments (из библиотеки поддержки), и использую FragmentTransaction.replace()
, чтобы поместить новые фрагменты в задний стек и заменить старый. Код выглядит следующим образом:
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = ft.beginTransaction();
// Animations in my res/anim folder
ft.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right);
ft.replace(R.id.fragment_container, newFragment, tag);
ft.addToBackStack(null);
ft.commit();
Это успешно заменяет мой фрагмент. Моя проблема заключается в следующем. В одном фрагменте у меня есть список элементов, которые создаются из пользовательского ввода. Теперь, когда пользователь нажимает кнопку "Далее", а затем нажимает кнопку "Назад" (чтобы вернуться к списку), список пуст, потому что представление уничтожено. Теперь я отметил следующее:
- onSaveInstanceState не вызывается. Я считаю, что это происходит потому, что это вызывается только, когда говорит родительская активность. Основываясь на документах: "Существует много ситуаций, когда фрагмент может быть в основном снесен (например, когда он помещен в задний стек без отображения пользовательского интерфейса), но его состояние не будет сохранено до тех пор, пока его собственная деятельность не должна фактически сохранять свое состояние.". По-видимому, выполнение замены на FragmentTransaction не является одним из тех случаев. Кто-нибудь имеет подтверждение по этому или лучшему объяснению?
- setOnRetainInstanceState (true) не помогает в этой ситуации. Опять же, я считаю, что это связано с информацией из документов: "Контролируйте, сохраняется ли экземпляр фрагмента в процессе повторного создания активности (например, при изменении конфигурации)". Я не выполняю никаких действий при воссоздании активности, поэтому это бесполезно.
Итак, я думаю, мой главный вопрос: есть ли способ сохранить состояние View (просто сохранить фрагмент) при использовании replace
? Существует FragmentTransaction.add()
, но есть несколько проблем с этим. Один из них заключается в том, что анимация выхода не выполняется, поэтому анимация неверна. Другим является то, что новый фрагмент, который старый фрагмент (тот, который помещается в невидимое состояние), остается кликабельным. Например, если у меня есть ListFragment, и я помещаю фрагмент содержимого поверх этого с помощью добавления, я все равно могу щелкнуть элементы списка в ListFragment.