2012-12-06 4 views
11

Seit ich meine App aktualisiert, um Unterstützung lib rev zu verwenden. 11 und kompiliert gegen SDK 4.2 ich die folgende FehlermeldungFragment bereits hinzugefügt. Support lib

java.lang.IllegalStateException: Fragment already added: i{4079e598 #2 id=0x1020002 i} 
    at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1159) 
    at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:729) 
    at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1493) 
    at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:477) 
    at android.support.v4.app.FragmentActivity.onBackPressed(FragmentActivity.java:174) 

ich ähnliche Probleme auf Stackoverflow gelesen haben. Einige von ihnen schlagen vor, die Ersetzungsmethode zu vermeiden, die ich nicht verwende. Die Transaktion, die den Absturz auf Rollback verursacht sieht wie folgt aus:

ft.remove(oldFrag).add(newFrag).addToBackStack(null).commit() 

Kommentare sagen, das auftreten kann, wenn Sie Fragment Übergänge verwenden, die nicht schnell genug beenden kann, bevor der Benutzer wieder drückt. Da ich Übergangsanimationen an den gegebenen Fragmenten verwende, könnte dies die Ursache sein. Das Entfernen des Übergangs ist jedoch keine Wahl, und da dieser ausschließlich bei Telefonen auftritt, die 2.3.x ausführen, und der Fehler durch das Upgrade auf lib 11 und sdk 4.2 eingeführt wurde, hoffe ich, dass google es mit der nächsten Version behebt.

Hat jemand ähnliche Probleme, Informationen darüber, ob dies in 4.2.1 oder Unterstützung r12 behoben werden soll, oder Vorschläge, was ich tun kann, um den Fehler zu umgehen?

+0

Getting das gleiche, aber mit 'DialogFragment'. –

+0

Ich bekomme es auch mit DialogFragment gelegentlich ... Ich habe einen Bericht [hier] (http://code.google.com/p/android/issues/detail?id=41552&thanks=41552&ts=1355757013) eingereicht. Aber keine Antwort noch. – phlebas

+0

hat den gleichen Fehler für die Support-Bibliothek r12 bekommen. Posted Trace auf Android-Problem Tracker zu. – Sash0k

Antwort

6

Ich versuche, das Problem mit einem Hinweis zu beheben fand ich here

So habe ich executePendingTransactions() sofort die Transaktion aus:

ft.remove(oldFrag).add(newFrag).addToBackStack(null).commit() 
getFragmentManager().executePendingTransactions(); 

Dies sollte sicherstellen, dass der Backstack ist immer in einem sauberen Zustand Ich hoffe und habe keine negativen Nachteile, die mir einfallen.

aktualisieren Obwohl es Arbeit auf normale Telefone der Fall ist, das Problem auf einige generische Geräte bleibt, die, wie 4.0.1 oder ähnliches keine bekannten Android Versionsnummer haben, sondern einige Datum berichten wie ‚Do 2. März 2006 00:00:00 GMT + 0100 (MEZ) 'als Android Versionsnummer, zB: samsung - espressowifixx - GT-P3110 meldet das angegebene Datum als Android Version und bringt die Fragment-Ausnahme hinzu ... Immer noch nervig. Die Nutzer kümmern sich nicht um diese Dinge, daher wird immer der bereits defizitäre Entwickler dafür verantwortlich gemacht. Kein Problem für Milliarden-Dollar-Unternehmen natürlich, aber einzelne Entwickler, nur etwas nützlicher mit Ihrer Zeit als schreiben apps;)

+0

Ich bekomme genau den gleichen Absturz und verwende die obige Zeile überhaupt nicht. Ich füge einfach ft.add (newFrag) .addToBackStack (null) .commit() wie folgt hinzu. – tasomaniac

+0

@phlebas Können Sie mir vorschlagen, sollte ich die FragmentManager.java Klasse in SUpport Bibliothek bearbeiten – Adi

+0

Bitte erwähnen Sie Ihren Code bitte. –

5

Also für mich stellte sich heraus, dass ich tatsächlich versuchte, ein Fragment zweimal hinzuzufügen. Vielleicht hat es in früheren Versionen der Support-Bibliothek das einfach verschluckt und ist weitergegangen. Leider habe ich sogar überprüft, ob das Fragment isAdded() für mich nicht funktionierte, denn in meinem Fall habe ich sie zurückgerufen, bevor die Transaktion Zeit hatte, das erste Fragment hinzuzufügen.

Was ich am Ende getan habe, war eine boolesche Klassenvariable fragmentAdded zu erstellen und direkt nach der Transaktion auf true zu setzen. Dann überprüfe ich diesen Boolean, bevor ich versuche, das Fragment hinzuzufügen. Vielleicht ist das keine Lösung für dein Problem, aber für mich war es das, also hoffentlich hilft es.

+5

wirklich traurig, dass wir das tun müssen. Gibt es wirklich keine Methode, um definitiv zu sagen, ob ein Fragment hinzugefügt wurde? –

Verwandte Themen