22

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

Кроме того, в этих FragmentsFragment.performCreateView() вызывается непосредственно без прохождения Fragment::onAttach() и так далее. Кроме того, некоторые из полей являются нулевыми внутри восстановленных Fragment ...

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

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

ответ

36

Мы закончили путем добавления к деятельности:

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

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

+1

Простой, но эффективный. Это действительно спасло мою задницу с текущим плохим дизайном (1 Activity App + 1 Fragment на экран). – momo

+0

Если у фрагмента есть некоторый пользовательский интерфейс, разве вы не считаете его плохим пользовательским интерфейсом. –

+2

Это работает как шарм, но я действительно надеюсь, что есть более чистый способ сделать это ... – jenzz

-1

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

+4

К сожалению, он автоматически восстанавливается ... – goRGon

0

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

7

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

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

ID, который удален из пучки, входит в состав 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; 
} 
+0

awesome. именно то, что я искал – Bolein95

1

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

ViewPager.onRestoreInstanceState(Parcelable state)

метод и вызвать

super.onRestoreInstanceState(null);

вместо этого.