2016-05-12 4 views
1

Ich fand ein sehr seltsames Verhalten von View Pager. Bei der Verwendung von FragmentPagerAdapter beobachtete ich, dass getItem() in der richtigen Reihenfolge aufgerufen wurde, dh Position 0, Position 1, Position 2 ...... , aber die onCreateView() wird in umgekehrter Reihenfolge aufgerufen, dh Position 2, Position 1, Position 0 (unter der Annahme, dass der Ansichtspager 3 Offscreen-Seiten verwaltet) Was ich denke, dass Viewpager irgendwie einen Stapel dieser Fragmente beibehält. Wenn es erforderlich ist, Ansichten zu erstellen, wird das aktivste Fragment aus dem Stapel entfernt, damit es als onCreateView() bezeichnet wird.Was ist die Reihenfolge des onCreateView() - Methodenaufrufs von Fragmenten beim Verwenden von Pager?

Also meine Frage ist, können wir die Reihenfolge des Aufrufs von onCreateView() steuern? Wenn nicht, kann ich die Netzwerkanforderungen, die ich beim Aufruf von onCreateView() erstelle, so bestellen, dass Netzwerkanforderungen von Fragment 0 zuerst ausgeführt werden sollen, dann Fragment 1 und dann Fragment 2. Aber ich denke, das würde ein anderes Problem verursachen, wie ich Ich führe die UI-bezogene Aufgabe aus, nachdem die Netzwerkanforderung abgeschlossen wurde und wenn onCreateView() bisher nicht aufgerufen wurde, dann werden die UI-Elemente möglicherweise nicht initialisiert. Also, was ist der beste Weg, um diese Netzwerk-Anrufe in der richtigen Reihenfolge zu machen, dh für Fragment 0, dann 1, dann 2 und so weiter ....

Antwort

0

Da onCreateView() ist eine Lebenszyklus-Methode - ich don Ich glaube nicht, dass Sie die Reihenfolge ändern können. Stattdessen sollten Sie Ihr Design um den Fragment-/Aktivitäts-Lebenszyklus konzeptualisieren, damit Sie wissen, wann Sie was tun sollten. Auch in Bezug auf UI-bezogene Aufgaben sollten Sie dies in der onActivityCreated tun. Diese Methode wird nach der Methode onCreateView() aufgerufen, wenn die Hostaktivität erstellt wird. Aktivitäts- und Fragmentinstanz wurden ebenso wie die Ansichtshierarchie der Aktivität erstellt. Zu diesem Zeitpunkt kann auf die Ansicht mit der Methode findViewById() zugegriffen werden.

In Ihrem Fall, wenn Sie einige UI-Operationen ausführen möchten gehen sie wie folgt dann (für jeden Fragment:

public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    View rooView = getView(); 
    //here you can do your UI related tasks 
} 

In Bezug auf die Erstellung Ihrer Fragmente Bestellung bitte the discussion here folgen, weil sie eine Verwendung behandeln Fall, der eng mit Ihrem verwandt ist.

+0

Vielleicht kann ich nicht die Aufrufe von onCreateView() ..... aber es muss ein Weg sein, so dass ich meinen eigenen View-Pager neu implementieren oder vorhandenen Viewpager überschreiben könnte, so dass ich sagen könnte, anstatt zu verwenden Stapel für das Halten von Fragmenten Seiten, sollte es Warteschlange verwenden. Damit konnte ich diese Fragmente in FIFO-Reihenfolge instantiieren. – charlie

0

Ich bin mir nicht sicher, aber ich denke, dass Sie die Reihenfolge nicht kontrollieren können, indem Adapter Tabview füllt. Wichtiger, sollten Sie es nicht kontrollieren. Fragmente sollten so unabhängig sein wie Starten Sie daher Ihre Netzwerkanfragen nach dem Aufruf von onCreateView, In Activity sto Es sind nur Daten, die Sie in allen 3 Fragmenten verwenden werden. Wenn Sie eine Netzwerkanforderung haben, die Daten für alle drei Fragmente bereitstellt, aktualisieren Sie Fragmente (mithilfe von Schnittstellen), wenn die Anforderung ausgeführt wird.

+0

Im Allgemeinen gibt es viele Fragmente. Und in jedem Fragment werden mehrere Netzwerkaufrufe ausgeführt. Nun, was passiert ist, dass alle Netzwerkaufrufe in Fragment 2 zuerst ausgeführt werden (aber Fragment 1 ist tatsächlich sichtbar) und dann kommen wir zu Fragment 1. Das erzeugt mehr Ladezeit für Fragment 1 und somit eine schlechte Benutzererfahrung. – charlie

Verwandte Themen