22

Utilizziamo frammenti e non è necessario ripristinarli automaticamente quando viene ricreata l'attività. Ma Android ogni volta che viene chiamato Activity::onCreate(Bundle savedInstanceState) ->super.onCreate(savedInstanceState), ripristina i frammenti anche se usiamo setRetainInstance (false) per quei frammenti.Prevenire il recupero dei frammenti in Android

Inoltre, in quelli FragmentsFragment.performCreateView() viene chiamato direttamente senza passare attraverso Fragment::onAttach() e così via. Inoltre, alcuni campi sono nulli all'interno ripristinati Fragment ...

Qualcuno sa come impedire a Android di ripristinare i frammenti?

P.S. Sappiamo che in caso di ricreare Activity per le modifiche di configurazione, potrebbe essere fatto aggiungendo per manifestare un ndroid:configChanges="orientation|screenSize|screenLayout. Ma che dire dell'attività di ricreazione in caso di pulizia automatica della memoria?

risposta

36

abbiamo finito con l'aggiunta all'attività:

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

sopprime qualsiasi dati salvati sul creare/ricreare il ciclo di un'attività ed evita i frammenti di auto ri-creazione.

+1

Semplice ma così efficace. Questo mi ha davvero salvato il culo con un cattivo design attuale (1 Activity App + 1 Fragment per screen). – momo

+0

Se il frammento ha qualche interfaccia utente, non pensi che sia una brutta esperienza utente. –

+2

Funziona come un incantesimo, ma spero davvero che ci sia un modo più pulito per fare questo ... – jenzz

-1

Visualizza la gerarchia non ripristinata automaticamente. Quindi, in Fragment.onCreateView() o Activity.onCreate(), è necessario ripristinare tutte le viste (da xml o programmaticamente). Ogni ViewGroup che contiene un frammento deve avere lo stesso ID di quando lo hai creato la prima volta. Una volta creata la gerarchia della vista, Android ripristina tutti i frammenti e inserisce le proprie viste nel ViewGroup corretto grazie all'ID. Supponiamo che Android ricordi l'ID del ViewGroup su cui si trovava un frammento. Questo accade da qualche parte tra onCreateView() e onStart().

+4

Sfortunatamente, viene ripristinato automaticamente ... – goRGon

0

Ho rimosso i frammenti in Activity onCreate.

7

La risposta di @goRGon è stata molto utile per me, ma tale uso causa seri problemi quando ci sono altre informazioni che è necessario inoltrare alla tua attività dopo la ricreazione.

Ecco una versione migliorata che rimuove solo "frammenti", ma mantiene tutti gli altri parametri.

L'ID rimosso dal pacchetto fa parte della classe android.support.v4.app.FragmentActivity come campo FRAGMENTS_TAG. Ovviamente può cambiare nel tempo, ma non è previsto.

@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

fantastico. esattamente quello che stavo cercando – Bolein95

1

Coloro che ha ottenuto NPE con ViewPager quando uso questo metodo descritto nella risposta accettata, si prega di sovrascrivono metodo

ViewPager.onRestoreInstanceState(Parcelable state)

e chiamare

super.onRestoreInstanceState(null);

invece.