22

Wir verwenden Fragmente und wir brauchen sie nicht automatisch wiederhergestellt werden, wenn die Aktivität neu erstellt wird. Aber Android jedes Mal, wenn Activity::onCreate(Bundle savedInstanceState) ->super.onCreate(savedInstanceState) aufgerufen wird, stellt Fragmente wieder her, selbst wenn wir setRetainInstance (false) für diese Fragmente verwenden.Verhindern Fragment Recovery in Android

Darüber hinaus wird in diesen FragmentsFragment.performCreateView() direkt ohne durchgehend Fragment::onAttach() und so weiter aufgerufen. Plus, einige der Felder sind null innerhalb wiederhergestellt Fragment ...

Weiß jemand wie man verhindert, dass Android Fragmente wiederherstellen?

P.S. Wir wissen, dass im Falle der Neuerstellung der Aktivität für Konfigurationsänderungen durch Hinzufügen zu Manifest eine ndroid:configChanges="orientation|screenSize|screenLayout. Aber was ist mit der Wiederherstellung der Aktivität im Falle einer automatischen Speicherbereinigung?

Antwort

36

Wir beendet durch zu Aktivität hinzufügen:

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

Es unterdrückt automatisch Neuschöpfung alle gespeicherten Daten erstellen/neu Zyklus einer Aktivität und vermeidet Fragmente.

+1

Einfach und doch so effektiv. Das hat meinen Arsch mit einem aktuellen schlechten Design gerettet (1 Activity App + 1 Fragment pro Bildschirm). – momo

+0

Wenn das Fragment einige UI hat, dann denken Sie nicht, dass es eine schlechte Benutzererfahrung ist. –

+2

Das funktioniert wie ein Zauber, aber ich hoffe wirklich, dass es einen saubereren Weg gibt, dies zu tun ... – jenzz

-1

Hierarchie wird nicht automatisch wiederhergestellt. In Fragment.onCreateView() oder Activity.onCreate() müssen Sie alle Ansichten wiederherstellen (aus XML oder programmgesteuert). Jede ViewGroup, die ein Fragment enthält, muss dieselbe ID haben wie bei der ersten Erstellung. Nachdem die Ansichtshierarchie erstellt wurde, stellt Android alle Fragmente wieder her und fügt ihre Ansichten dank der ID in die richtige ViewGroup ein. Nehmen wir an, Android erinnert sich an die ID der ViewGroup, auf der sich ein Fragment befand. Dies passiert irgendwo zwischen onCreateView() und onStart().

+4

Leider ist es automatisch wiederhergestellt ... – goRGon

0

Ich entfernte die Fragmente in Activity onCreate.

7

Die Antwort von @goRGon war sehr nützlich für mich, aber eine solche Verwendung kann zu ernsthaften Problemen führen, wenn es nach dem Erstellen weitere Informationen gibt, die Sie an Ihre Aktivität weiterleiten müssen.

Hier ist eine verbesserte Version, die nur "Fragmente" entfernt, aber alle anderen Parameter behalten.

ID, die aus dem Bundle entfernt wird, ist Teil der android.support.v4.app.FragmentActivity Klasse als FRAGMENTS_TAG Feld. Es kann natürlich im Laufe der Zeit ändern, aber es ist nicht zu erwarten. Diejenigen

@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

genial. genau das was ich gesucht habe – Bolein95

1

die NPE bekam mit ViewPager bei der Verwendung dieser Methode in der akzeptierte Antwort beschrieben, außer Kraft setzen Sie sich bitte

ViewPager.onRestoreInstanceState(Parcelable state)

Methode und rufen

super.onRestoreInstanceState(null);

statt.