22

Używamy fragmentów i nie musimy ich automatycznie odzyskiwać po odtworzeniu działania. Ale Android za każdym razem, gdy wywoływana jest Activity::onCreate(Bundle savedInstanceState) ->super.onCreate(savedInstanceState), odtwarza Fragmenty, nawet jeśli użyjemy setRetainInstance (false) dla tych Fragmentów.Zapobieganie odzyskiwaniu fragmentów w systemie Android

Ponadto w tych FragmentsFragment.performCreateView() jest wywoływana bezpośrednio bez przechodzenia przez Fragment::onAttach() i tak dalej. Ponadto niektóre z pól mają wartość zerową w środku przywróconą Fragment ...

Czy ktoś wie, w jaki sposób zapobiec odrestorowaniu fragmentów przez system Android?

P.S. Wiemy, że w przypadku odtwarzania aktywności w celu zmiany konfiguracji można to zrobić, dodając do manifestu ndroid:configChanges="orientation|screenSize|screenLayout. Ale co z odtwarzaniem aktywności w przypadku automatycznego czyszczenia pamięci?

Odpowiedz

36

Skończyliśmy dodając do aktywności:

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

To tłumi każdy zapisane dane na tworzenie/odtworzenie cyklu prowadzonej działalności i unika fragmenty automatyczne odtworzenie.

+1

Proste, ale tak skuteczne. To naprawdę uratowało moją dupę przy obecnym złym projekcie (1 aplikacja aktywności + 1 fragment na ekranie). – momo

+0

Jeśli fragment ma jakiś interfejs użytkownika, nie uważasz go za zły. –

+2

Działa to jak urok, ale mam nadzieję, że istnieje czystszy sposób robienia tego ... – jenzz

-1

Hierarchia widoków nie jest automatycznie przywracana. Tak więc, w Fragment.onCreateView() lub Activity.onCreate(), musisz przywrócić wszystkie widoki (z xml lub programowo). Każda grupa ViewGroup zawierająca fragment musi mieć taki sam identyfikator, jak przy pierwszym utworzeniu. Po utworzeniu hierarchii widoków Android odtwarza wszystkie fragmenty i umieszcza ich widoki w prawej grupie ViewGroup dzięki identyfikatorowi. Powiedzmy, że Android zapamiętuje identyfikator grupy ViewGroup, w której znajdował się fragment. Dzieje się to między onCreateView() i onStart().

+4

Niestety, jest automatycznie przywracana ... – goRGon

0

Usunąłem fragmenty z Aktywności na Utwórz.

7

Odpowiedź @goRGon była dla mnie bardzo przydatna, ale takie użycie powoduje poważne problemy, gdy po odtworzeniu jest więcej informacji, które musisz przekazać do swojej aktywności.

Oto ulepszona wersja, która usuwa tylko "fragmenty", ale zachowuje wszystkie pozostałe parametry.

Identyfikator usunięty z pakietu jest częścią klasy android.support.v4.app.FragmentActivity jako pole FRAGMENTS_TAG. Może się oczywiście zmieniać z biegiem czasu, ale nie jest to oczekiwane.

@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

niesamowita. dokładnie to, czego szukałem – Bolein95

1

Kto dostał NPE z ViewPager gdy stosowanie tej metody opisane w przyjętym odpowiedź, proszę zastąpić

ViewPager.onRestoreInstanceState(Parcelable state)

metody i zadzwonić

super.onRestoreInstanceState(null);

zamiast.

Powiązane problemy