3

Seit Support-Version 25.1.0 und die neueste 25.1.1 Ich habe seltsames Verhalten mit Fragment ersetzen/hinzufügen. Es wurden Probleme gemeldet für 25.1.0 Android - fragmentTransaction.replace() not works on support library 25.1.0Fragment popbackstack Verhalten in 25.1.0 und 25.1.1

Aber jetzt in 25.1.1 habe ich ähnliche Probleme. Um das Verhalten zu reproduzieren, habe ich eine Beispiel-App erstellt, die Sie unter https://github.com/holoduke/fragmenttest

finden können.

Es ist im Grunde eine Aktivität mit einem Fragment-Container. Ein paar Fragmente stehen zur Verfügung, die sich durch einen Knopfdruck dynamisch ersetzen. Wir beginnen damit, FragmentA von der mainActivity selbst hinzuzufügen.

FragmentManager fm = getSupportFragmentManager(); 
    FragmentTransaction ft = fm.beginTransaction(); 

    Fragment f = new FragmentA(); 
    fm.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
    f.setRetainInstance(false); 
    ft.replace(R.id.fragmenttarget, f); 
    ft.addToBackStack(null); 
    ft.commit(); 

Alles gut funktioniert gut. in sowohl 25.0.1, 25.1.0 und 25.1.1

nun in fragmenta gibt es 3 Tasten, die alle mit dem aktuellen Fragment entweder fragmenta, fragmentB oder fragmentC

der Code für das Hinzufügen von Fragment B und C ersetzt wird ist ein fast das gleiche wie Fragment außer wir nicht definiert haben:

fm.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 

wenn Fragment B oder C wird der folgende Code ausgeführt wird hinzugefügt: alle

FragmentManager fm = getSupportFragmentManager(); 
    FragmentTransaction ft = fm.beginTransaction(); 

    Fragment f = new FragmentB(); 
    f.setRetainInstance(false); 
    ft.replace(R.id.fragmenttarget, f); 
    ft.addToBackStack(null); 
    ft.commit(); 

noch gut in beiden 25.0.1, 25.1.0 und 25.1.1. Wenn Sie fragmentB und C ein paar Mal hinzufügen, erhöht sich die fm.getBackStackEntryCount(). Das ist gut.

Jetzt der seltsame Teil. Wir wollen FragmentA mit popStackImmediate hinzufügen (um Geschichte zu löschen) Hier wird das Verhalten der beiden 3 Support-Versionen verrückt.

Lassen Sie uns sagen, dass Sie die folgenden bavhiour in allen drei Versionen ausführen:

  1. Start app
  2. ersetzen mit Fragment B
  3. mit Fragment C ersetzen
  4. mit Fragment B ersetzen
  5. ersetzen mit Fragment C
  6. durch Fragment A ersetzen

in 25.0.1 funktioniert alles gut. Der Backstack wird gelöscht und OnCreateView und ActivityCreated werden in FragmentA aufgerufen.

in 25.1.0 irgendwie nach dem Ersetzen mit FragmentA die onCreateView und ActivityCreated aufgerufen werden 2 mal. Nicht gut.

in 25.1.1 ist es noch schlimmer. Nach dem Ersetzen durch fragmentA werden für alle Ansichten im Backstack onCreateView und ActivityCreated aufgerufen. Nun, das ist witzig richtig :)

Probieren Sie einfach meine Beispiel-App und schauen Sie im Logcat. Ändern Sie die Support-Version in App.Gradle-Datei, um die Unterschiede zu sehen.

Ich würde mich freuen, wenn jemand dieses Problem auch erkennen kann, so können wir einen Weg finden, dieses Problem zu überwinden oder sogar zu lösen.

+0

Ersetzen Sie das "Fragment" durch das "Fragment" selbst? Wenn ja, benutze 'getChildFragmentManager()' - muss nur geklärt werden. –

+0

Kein Ersetzen von der MainActivity. siehe https://github.com/holoduke/fragmenttest/blob/master/app/src/main/java/com/test/fragment/gillis/testfragment/MainActivity.java –

+1

Ich bestätige, dass, wenn Sie zu einem Fragment tiefer in der stack, alle Fragmente dazwischen haben ihre onCreateView in 25.1.1 aufgerufen. Dies hat meine App, die bis zum Update auf 25.1.1 funktionierte, durchbrochen. Downgrade auf 25.1.0 hat mein Problem gelöst. Mein Ersatz geht jedoch wie A-> B-> C-> D, was sich von Ihrem Beispiel unterscheidet, so dass ich möglicherweise nicht auf das Problem gestoßen bin, das Sie in 25.1.0 erwähnt haben. –

Antwort

4

Nun, ich konfrontiert mit dem gleichen Problem und fand eine Lösung durch den Vergleich 25.0.1 -> 25.1.1 FragmentManager.class. Versuchen Sie setAllowOptimization Methode von FragmentTransaction zu verwenden.

Verwandte Themen