Предотвращение восстановления фрагментов в Android

Мы используем фрагменты, и нам не нужно, чтобы они автоматически восстанавливались при восстановлении Activity. Но Android каждый раз, когда Activity::onCreate(Bundle savedInstanceState) -> super.onCreate(savedInstanceState) , восстанавливает фрагменты, даже если мы используем setRetainInstance (false) для этих фрагментов.

Более того, в тех Fragments Fragment.performCreateView() вызывается непосредственно, не проходя через Fragment::onAttach() и так далее. Кроме того, некоторые поля имеют нулевое значение внутри восстановленного Fragment

Кто-нибудь знает, как запретить Android восстанавливать фрагменты?

PS Мы знаем, что в случае воссоздания Activity для изменений конфигурации это можно сделать, добавив в манифест ndroid:configChanges="orientation|screenSize|screenLayout . Но как насчет воссоздания активности в случае автоматической очистки памяти?

Solutions Collecting From Web of "Предотвращение восстановления фрагментов в Android"

Мы закончили, добавив к активности:

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(null); } 

Он подавляет любые сохраненные данные о создании / воссоздании цикла Activity и позволяет избежать повторного создания фрагментов.

Ответ @goRGon был очень полезен для меня, но такое использование вызывает серьезные проблемы, когда есть дополнительная информация, которую вам нужно переслать в свою деятельность после воссоздания.

Вот улучшенная версия, которая удаляет только «фрагменты», но сохраняет все остальные параметры.

Идентификатор, удаленный из пакета, является частью класса android.support.v4.app.FragmentActivity как поля FRAGMENTS_TAG . Разумеется, он может меняться со временем, но этого не ожидается.

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(createBundleNoFragmentRestore(savedInstanceState)); } /** * Improve bundle to prevent restoring of fragments. * @param bundle bundle container * @return improved bundle with removed "fragments parcelable" */ private static Bundle createBundleNoFragmentRestore(Bundle bundle) { if (bundle != null) { bundle.remove("android:support:fragments"); } return bundle; } 

Я удалил фрагменты в Activity onCreate.

Те, кто получил NPE с ViewPager при использовании этого метода, описанного в принятом ответе, пожалуйста, переопределите

ViewPager.onRestoreInstanceState(Parcelable state)

Метод и вызов

super.onRestoreInstanceState(null);

вместо.

Просмотр иерархии не восстанавливается автоматически. Итак, в Fragment.onCreateView() или Activity.onCreate() вам необходимо восстановить все представления (из xml или программно). Каждая группа просмотра, содержащая фрагмент, должна иметь тот же идентификатор, что и при его создании в первый раз. После создания иерархии представлений Android восстанавливает все фрагменты и помещает их в нужную ViewGroup благодаря идентификатору. Скажем, что Android запоминает идентификатор ViewGroup, на котором был фрагмент. Это происходит где-то между onCreateView() и onStart() .