Android-Fragment in einen anderen Container verschieben Die Container-ID des Fragments kann nicht geändert werden

7

Hier ist, was ich meine Anwendung auf einem Tablet tun möchte. Fragment (0) hat ein Menü, das Fragmente (1) anzeigen würde ... (n) wie folgt:

%Vor%

Fragment0 bewegt sich nie, die anderen werden nach rechts verschoben. Fragmente, die von der Kante nach rechts abgehen, werden zerstört.

Also habe ich mein XML-Layout mit einem horizontalen LinearLayout und 4 FrameLayout mit den richtigen IDs (fragment0 ... fragment3)

eingerichtet

Ich kann Fragment0 und dann Fragment1 instantiieren und anzeigen, aber ich bin nicht in der Lage, es nach rechts zu verschieben, ich bekomme:

%Vor%

Die einzigen verwandten Fragen, die ich gefunden habe, sind diese und dieser , versuchte alle verschiedenen Lösungen ohne Glück.

Versuchte FragmentTransaction.remove() , gefolgt von .add() , versuchte .replace() , probierte sie in verschiedenen Reihenfolgen aus und beging den halben Weg (versuchte sogar zweimal zu committen, wie jemand vorgeschlagen hatte), versuchte addToBackStack() ... aufzurufen. immer noch kein Glück.

Frage ist, ob es möglich ist, die Fragmente mit einer FragmentTransaction so zu verschieben. Wenn ja, was mache ich falsch (und Bonus, ist es möglich, das zu animieren?). Wenn nein, was wäre der richtige Weg, dies zu implementieren?

Beachten Sie, dass ich die Fragmente nicht jedes Mal erneut instantiieren möchte (jede führt einige Abfragen im Web aus, die einige Zeit dauern können). Es ist möglich, alle Daten zurück in die Aktivität zu extrahieren, um eine neu zu erstellen, aber ich würde das lieber nicht tun, wenn es möglich ist ...

    
Matthieu 28.11.2012, 09:30
quelle

2 Antworten

3

Ich weiß nicht, ob das genau das ist, was Sie wollen, aber ich habe eine kleine Probe in Bezug auf Ihr Problem gemacht. Im Grunde werden Sie die richtige Verschiebung mit der Layout-Datei vornehmen und einen Wrapper-Container für jedes der sich verschiebenden Fragmente haben. Das Codebeispiel ist ein wenig zu groß für eine Antwort, daher habe ich es in ein Stichwort, das Sie hier finden . In diesem Beispiel drücke jedes der Elemente ListFragment (Fragment 1 - & gt; Fragment 2 - & gt; Fragment 3), um das Verhalten zu sehen.

    
Luksprog 28.11.2012, 15:51
quelle
20

Ja container des Fragments kann mit remove() function geändert werden.

Das Problem hier ist commit() . Es ist ein asynchroner Aufruf und wird so geplant, dass er sich im Hauptthread befindet. Um das FragmentManager dazu zu zwingen, dies sofort zu tun, bevor es dem anderen Container hinzugefügt wird.

Dafür müssen wir die Funktion executePendingTransactions() verwenden. Versuchen Sie nach dem Aufruf das Fragment zu einem neuen Container hinzuzufügen.

Dokumente: executePendingTransactions ()

Codebeispiel:

%Vor%

Viel Spaß. Feed-backs sind willkommen

Bearbeiten

Ich möchte hier einen Punkt hinzufügen. Da ich das gleiche Problem hatte, kam dieser Thread auf und schlug vorgeschlagene Änderungen vor. Das Problem bestand immer noch. Dann habe ich den letzten Kommentar in diesem Thread gelesen, der mein Problem gelöst hat: Entferne addToBackStack() -Methode, während du eine Transaktion festlegst, oder wenn du sie absichtlich verwendest, entferne das Fragment aus dem Backstack, bevor du es zu einem anderen Container hinzufügst. Ich hoffe, es wird zukünftigen Lesern helfen.

    
Pavan Jaju 13.06.2016 09:59
quelle