2013-02-11 6 views
13

Dies ist die Funktion verantwortlich für Fragmente Hinzufügen Stapel nach hinten:Android - addToBackStack() funktioniert nicht?

public void populateContent(File f) 
{ 

    ContentFragment cf = new ContentFragment(ctx, ac, this); 
    FragmentTransaction transaction = ac.getSupportFragmentManager().beginTransaction();; 
    cf.updateView(f); 

    transaction.replace(R.id.contentFragment, cf); 

    transaction.addToBackStack(null); 

    transaction.commit(); 

} 

Wenn ich die Zurück-Schaltfläche klicken, wird das letzte Fragment geladen werden nicht (nichts passiert).

Irgendeine Idee was könnte das verursachen?

Bearbeiten: FragmentManager Protokoll.

http://pastebin.com/mYnVdkLG

Es scheint mir, als ob meine Anwendung zweimal die zweite Ansicht zu speichern, anstatt die erste retten und dann den zweiten Blick.

+0

Ich glaube, Sie sollten addtobackStack() und dann das Fragment ersetzen ... – user1969053

+0

Das hat es nicht gelöst. – Tool

+0

Schauen Sie diese Antwort: http://StackOverflow.com/A/14030872/1484779 – jlopez

Antwort

11

Ich bin mir nicht sicher über die tatsächliche Lösung, aber ich kann Sie ein wenig führen und vielleicht können Sie herausfinden, was das Problem ist.

Ersetzen Sie tatsächlich zwei Fragmente? Wenn Sie dies nicht tun, wird keine Transaktion zurückgesetzt. Ist auch Ihre erste Fragment von XML hinzugefügt? Der Manager wird dieses Fragment nicht kennen und Sie müssen möglicherweise auch die erste mithilfe einer Transaktion hinzufügen.

Achten Sie darauf, nach if (savedInstanceState == null) performFirstTransaction() zu überprüfen, sonst werden Sie am Ende Ihre erste Fragment zweimal hinzufügen.

Eine gute Idee ist es, enableDebugLogging in der FragmentManager zu verwenden. Dadurch erfahren Sie, welche Fragmente der Manager kennt.

sehen: http://developer.android.com/reference/android/app/FragmentManager.html#enableDebugLogging(boolean)

Als Randbemerkung, ist es nicht einen benutzerdefinierten Konstruktor für Ihre Fragment empfohlen zu verwenden. Der Grund dafür ist, dass, wenn Ihre App vom Betriebssystem gelöscht und erneut instanziiert wird, der leere Konstruktor aufgerufen wird.

Sie sollten eine statische Methode wie ContentFragment.getInstance(<params>) verwenden, um Ihre Fragment zu erstellen.

Weitere Informationen finden Sie unter: http://developer.android.com/reference/android/app/Fragment.html im Abschnitt "Klassenübersicht".

Ich hoffe meine Antwort hilft Ihnen ein wenig, um das Problem zu finden.

+0

Ich kann Ihnen die FragmentManager Protokolle zeigen, vielleicht werden sie helfen. – Tool

+0

Ich habe auch keinen benutzerdefinierten Konstruktor für mein Fragment - ich habe es nicht geändert. Ich habe jedoch eine Methode im Fragment, die als Ansichtsaktualisierung dient. – Tool

+0

Okay, ich habe den Log-Link vom Manager veröffentlicht. – Tool

51

Es scheint, dass der Aufruf von addToBackStack() auf Fragment-Transaktion nicht genug ist, müssen wir das Auftauchen des Backstacks auf Back-Taste von uns gedrückt behandeln. Ich habe diese auf meine Tätigkeit und es funktionierte wie erwartet:

@Override 
public void onBackPressed() { 
    if (getFragmentManager().getBackStackEntryCount() > 0){ 
     getFragmentManager().popBackStack(); 
    } else { 
     super.onBackPressed(); 
    } 
} 
+3

Das funktioniert, aber die Animation wird nicht wiedergegeben. EDIT: Wenn Sie die Animation auf dem Popbackstack wiedergeben möchten, fügen Sie zwei zusätzliche Parameter hinzu, wenn Sie setCustomAnimation aufrufen. Siehe [hier] (http://stackoverflow.com/questions/25485822/android-pop-fragment-from-backstack-with-animation). – Nathan

+2

Das funktioniert gut. Es ist überraschend, dass wir selbst damit umgehen müssen, weil die Dokumentation sagt, dass dies automatisch passieren wird. – Ankit

+0

Wenn dies etwas dokumentiert ist? – Defuera

2

ich hinzufügen, nicht ersetzen, aber ich hatte addToBackStack (null) vor add(), nicht nach dem, auf dem Fragment aufzurufen, die zu schließen, nicht auf dem Fragment, das offen bleiben wird.

In der Klasse A (zuerst geöffnet)

FragmentTransaction ft = fm.beginTransaction(); 
ft.add(R.id.layout_a, f, Constants.FRAGMENT_KEY); 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
ft.commit(); 

In der Klasse B (nach Klasse A geöffnet)

FragmentTransaction ft = fm.beginTransaction(); 
ft.addToBackStack(null); 
ft.add(R.id.layout_b, f, Constants.FRAGMENT_KEY); 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
ft.commit(); 
+0

addToBackStack beim Ausführen des Hinzufügen/Ersetzen des Fragments ist, was es für mich getan hat. – Clocker

+0

* "call addToBackStack (null) vor add(), nicht nach" * Dies ist genau das, was mein Problem war. Du hast mir jede Menge Kopfschmerzen erspart. Vielen Dank! –

Verwandte Themen