onViewCreated - Falscher Ort zum Ersetzen des Fragments?

10

Ich zeige ein leeres Fragment, wenn der Benutzer keine Daten hat. In diesem emptyFragment (in onViewCreated ) suche ich nach einer Bedingung und möchte manchmal dieses leere Fragment durch ein anderes ersetzen, also rufe ich eine Methode auf die entsprechende Aktivität, die das Fragment ersetzt.

Einige Benutzer (derzeit nur Samsung, 6.0.1, aber ich weiß nicht, ob das irgendwas bedeutet) haben einen Absturz in der Zeile, in der ich executePendingTransactions :

%Vor%

Ist das ein Fehler in 6.0.1 oder ist onViewCreated der falsche Ort dafür?

BEARBEITEN

Wäre das eine mögliche Lösung?

%Vor%     
swalkner 13.11.2016, 08:55
quelle

2 Antworten

5

Zuallererst: Warum verschiebst du nicht die "check condition" in deiner Aktivität? Auf diese Weise können Sie entscheiden, welches Fragment Sie benötigen: das eine, das leere Werte verwaltet, oder das andere.

Zweitens: Ich schlage vor, zwei kleine Tutorials zu Fragmenten commit und Staatsverlust . Sie können dort viele Fehlerbedingungen finden, die mit Fragmenten zusammenhängen.

Und schließlich lautet die Antwort zu 'FragmentManager bereits Transaktionen': Es gibt mindestens zwei verschachtelte Aufrufe an die Methode executePendingTransactions() , dh Sie fragen nach dem Fragmentmanager (es gibt eine einzelne Instanz von Fragment Manager pro Aktivität), um eine Transaktion auszuführen, während eine andere Transaktion ausgeführt wird. Es ist schwer zu identifizieren, wo das Problem liegt. Sie sollten den gesamten Code der Aktivität und alle beteiligten Fragmente veröffentlichen, nur um einen (den ersten) Aufruf von executePendingTransactions zu identifizieren und zu entfernen, aber ich kann Ihnen ein paar Tipps geben:

  1. Verwenden Sie nicht executePendingTransactions() . Es ist schwer, einen Code beizubehalten, der eine Art von Orchestrierung zwischen Fragmenten erfordert
  2. Verwenden Sie commit() , wenn Sie keinen sofortigen Zugriff auf die Fragmente benötigen, die Sie zu Ihrer Aktivität hinzufügen. Das einfache Commit führt alle Transaktionen aus, sobald der Hauptthread frei ist.
  3. Wenn Sie einen sofortigen Zugriff auf ein Fragment benötigen, verwenden Sie commitNow() . Ehrlich gesagt habe ich diese Methode nur wenige Male benutzt, hauptsächlich um DialogFragments korrekt zu handhaben.

commitNow() ist für Pre 24-Geräte verfügbar, wenn Sie die Support-Bibliothek verwenden , die ich Ihnen vorschlagen zu adoptieren.

    
Mimmo Grottoli 16.11.2016 22:30
quelle
0

Versuchen Sie FragmentTransaction.commitNow(); , wenn Sie mit sdk 24 arbeiten, anstatt commit()

zu verwenden

Für ältere Versionen: FragmentManager.executePendingTransactions() nach dem Aufruf von commit()

    
Tíbó 15.11.2016 10:27
quelle