IllegalArgumentException: Keine Ansicht für ID für Fragment beim schnellen Wechseln von ActionBar Tabs gefunden

8

Ich entwickle eine Android App für Tablets und nicht mit der Kompatibilitätsbibliothek.

Es gibt nur eine Aktivität und es verwendet die ActionBar mit 3 Tabs. Im TabListener verwende ich setContentView, um das für diese Registerkarte spezifische Layout zu laden und dann die relevanten Fragmente zu ihren Rahmen hinzuzufügen. Dieses fast funktioniert genau so, wie ich es möchte, außer wenn du schnell zwischen den Tabs wechselst, wird die App abstürzen.

Ich benutze ein Samsung Galaxy Tab als mein Debugging-Gerät und das Wechseln von Tabs ist wirklich schnell. In einem normalen Tempo kann ich zwischen ihnen hin und her tippen und die Seiten werden sofort geladen. Das Problem ist, wenn ich zwischen den Tabs hyperwechsle.

Zuerst habe ich ein

%Vor%

wie hier zu sehen: Ссылка Nach dem Vorschlag, try / catch-Blöcke in onTabUnselected zu verwenden, habe ich die App ein wenig robuster gemacht, aber das führte zu dem Problem:

%Vor%

Ich habe keinen anderen Fall im Netz eines anderen gefunden, der das gleiche Problem hat, daher habe ich Bedenken, dass ich etwas tun könnte, das nicht unterstützt wird. Noch einmal versuche ich, drei verschiedene Layouts in einer Aktivität zu verwenden - wenn Sie auf eine Registerkarte klicken, ruft der Listener setContentView auf, um das Layout zu ändern, und fügt dann die Fragmente hinzu. Es funktioniert wunderbar, wenn Sie nicht aggressiv zwischen Tabs wechseln.

Ich habe die Idee dazu von: Ссылка und anstatt den TabListener einen Verweis auf ein Fragment zu behalten, habe ich ein Array von ihnen. Außerdem verwende ich nicht attach / detach, da diese nur in API 13 hinzugefügt wurden.

Meine Theorie ist, dass entweder setContentView die Ansichten nicht fertig erstellt hat und deshalb kann FragmentTransaction sie nicht hinzufügen, ODER die Fragmente werden für eine Registerkarte hinzugefügt, wenn eine andere Registerkarte ausgewählt und setContentView aufgerufen wird, wodurch die andere Gruppe zerstört wird von Ansichten.

Ich habe versucht, etwas zu hacken, um die Tab-Umschaltung zu verlangsamen, aber ich kam nicht weiter.

Hier ist der Code für meinen TabListener:

%Vor%

Und schließlich der Stack-Trace:

%Vor%

DANKE!

    
hooby3dfx 28.09.2011, 20:13
quelle

4 Antworten

5

Okay, einen Weg gefunden:

Fügen Sie die Referenzen zu den Fragmenten in die Layoutdateien ein und umschließen Sie den setContentView-Aufruf in onTabSelected in einem try / catch-Block.

Die Ausnahmebehandlung hat dafür gesorgt!

    
hooby3dfx 30.09.2011, 15:42
quelle
1

Ich weiß, es ist eine etwas alte Frage, aber ich hatte das gleiche und finde eine andere Arbeit.

Die Methode selbst wird hier beschrieben Vermeiden Sie es, dieselbe Ansicht neu zu erstellen, wenn Sie Tab ausführen Wechsel

aber im Kontext dieses spezifischen Absturzes vermeidet das Ausführen von show / hide anstelle von add / replace mehrere schnelle Aufrufe von onCreateView auf dem Fragment.

Mein endgültiger Code endete in etwa so:

%Vor%     
Budius 19.12.2012 16:07
quelle
0

Einen ähnlichen Fall in einem Google Play-Absturzbericht sehen.

%Vor%

Relevanter Code:

%Vor%

^^ Hier stürzt es ab

Das Fragment ist definitiv da (es wurde von findFragmentById zurückgegeben), aber Aufruf von hide () explodierte mit der "IllegalStateException: Fragment not added"

Nicht hinzugefügt? Wie wird es nicht hinzugefügt, wenn findFragmentById es finden konnte?

Alle FragmentManager-Aufrufe werden vom UI-Thread ausgeführt.

Das zu entfernende Fragment (fragDisplay) wurde früher hinzugefügt und ich bin mir sicher, dass seine FragmentTransaction ausgeführt wurde.

    
Kostya Vasilyev 26.08.2014 21:27
quelle
0

Es wurde behoben, indem ich meine Fragmente durchschleifte, irgendwelche von ihnen entfernte und dann die neue hinzufügte. Überprüfen Sie auch zuerst, dass Sie nicht versuchen, es durch Null oder ein vorhandenes Fragment zu ersetzen.

Bearbeiten: sieht so aus, als wäre es nur

%Vor%

das hat verhindert, dass es abstürzt

%Vor%     
kylarsturn 29.09.2014 06:43
quelle