Ich arbeite mit dem Legacy-Code und ich fand ein inkonsistentes Verhalten in dieser Funktion:
%Vor% openFragment
erhält nicht leere Bündelargumente, aber doOpenFragment
erhalten ein leeres Bündel. Fragmente werden übergeben, indem commitAllowingStateLoss()
Eine schnelle Lösung kann Bundle.clone () sein:
%Vor% Es wird nicht alle Fälle behandeln und deepCopy
ist nur in api26 verfügbar.
[ UPDATE ]
Ich habe mit @ Pavel 's Lösung gespielt und die Dinge werden seltsamer
%Vor%[UPDATE2]
Tatsächlich ist das Problem nicht mit postDelayed
call. Lassen Sie uns den Call-Stack sehen:
in goRightToTheCollectionScreen
das Bundle wird erstellt und gepackt (nichts Verdächtiges, keine Mutation danach).
Ich vermute, die Quelle des Problems in zwei Aufrufen innerhalb von openFragmentsChain
:
Der Code, den Sie gepostet haben, scheint in Ordnung zu sein, daher wird Ihr Paket wahrscheinlich anderswo modifiziert (auch wenn Ihre postDelayed-Verzögerung 0 ist, wird das Runnable etwas später ausgeführt und Sie können das Paket in der Zwischenzeit modifizieren). Versuchen Sie, es direkt ohne postDelayed auszuführen, um zu sehen, ob das Problem weiterhin besteht. Sie können mehr von Ihrem Code posten, vielleicht können wir herausfinden, wo Sie sonst das Bündel berühren.
Wenn nichts anderes hilft, können Sie die Methode immer von API26 in Ihren Code kopieren und verwenden (Edge Case - das scheint ein einfaches Problem zu sein, also sollten Sie nicht müssen)
Konnte Modellbündelarg nicht zu "leer" wechseln. Einfacher Code mit dem Fragment, das Handler-Beispiel mit dem angegebenen args-Wert aufruft. Wenn ich etwas falsch modelliere, geben Sie mir einen Hinweis
%Vor%Tags und Links android asynchronous android-handler android-bundle