2016-03-26 4 views
0

Ich entwickle eine Android-Anwendung mit einer Navigation Ansicht, bemerkte ich, dass jedes Mal, wenn ich ein Fragment durch ein anderes die Gesamtzahl der Fragmente in meinem Fragment Manager erhöhen bis meiner Anwendung zermalmt mit diesem Fehler:jedes Mal, wenn ich Fragment mit einer anderen Anzahl von Fragment in meinem FragmentManager ersetze erhöht

A/libc: Fatal signal 11 (SIGSEGV), code 1 

bemerkte ich, dass die Zahl mit einer Meldung in onNavigationItemSelected Funktion in meinem Log erhöht:

Log.d("fragmentNumber:", fragmentManager.getFragments().size() + ""); 

dies meine Funktion ist ich aufgerufen, wenn ein Fragmen ersetzen t mit einem anderen:

public void showFragment(final Fragment fragment) { 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     if (fragment != null) { 
      fragmentTransaction.replace(R.id.container, fragment); 
      fragmentTransaction.addToBackStack(null); 
      fragmentTransaction.commit(); 
     } 
    } 

Antwort

2

Sie sind ein replace() und ein addToBackStack() tun. Nehmen wir an, Sie haben die Fragment-Instanz 1. Sie führen den Code aus und ersetzen ihn durch die Fragment-Instanz 2. Der Aufruf addToBackStack() bedeutet, dass der Fragment-Manager die Fragment-Instanz 1 anhalten muss, da Sie die Zurück-Schaltfläche drücken können das Ersetzen und erneute Anzeigen von Fragment 1. Dies wird mit dem dritten, vierten, fünften Fragment und immer weiter geschehen, bis der Speicher aufgebraucht ist. Und beachte, dass ich "Instanz" gesagt habe. Es spielt keine Rolle, ob die Fragmente alle dieselbe Klasse haben oder nicht; Wenn Sie new MyFragment() sagen, erstellen Sie eine neue Instanz. Und jede Instanz wird mehr und mehr Speicher beanspruchen - bis Sie aus sind.

Anstatt jedes Mal zu ersetzen, möchten Sie möglicherweise zu einem Fragment zurück navigieren, wenn es bereits auf dem Backstack ist. Nehmen wir an, Sie haben eine DataListFragment durch eine DataDetailsFragment ersetzt. Wenn der Benutzer mit der Navigationstaste (anstatt der Schaltfläche Zurück) zur navigieren möchte, können Sie fragmentManager.popBackStack() anrufen, um das Drücken der Zurück-Taste zu simulieren und die DataListFragment erneut anzuzeigen.

Wenn Sie die Navigation nicht so einfach verfolgen können, können Sie einen Backstack-Eintrag mit addToBackStack(String name) markieren und dann später FragmentManager.popBackStack (String name, int flags) verwenden, um zu diesem Fragmentstatus zurückzukehren.

Das Verwalten des Fragmentstatus und des Rückstapels ist schwierig. Wenn ich Ihnen die Masse des Codes zeigen könnte, den ich gerade geschrieben habe, um damit umzugehen, könnten Ihre Augäpfel knallen (aber der Code ist proprietär, also kann ich nicht).

+0

thx für deinen Rat, es hat mir geholfen;) – S4M37

Verwandte Themen