Warten Sie mit der Operation, bis die Ansichten von Fragment erstellt sind

8

Ich programmiere einen Musik-Player und die Musik spielt in einem Hintergrund Service . Wenn der Benutzer den Activity , der 3 Fragments hostet, killt und dann den Activity erneut startet, sende ich ein Broadcast von Service , das Informationen über das aktuelle Lied und die Liste der Lieder enthält Der Benutzer hat seiner Sitzung hinzugefügt.

Das Problem ist, dass jedes Mal, wenn ich die letzte Information in Fragments einstellen möchte, nichts passiert, weil ihre Erstellung zu lange dauert und die Broadcast nicht so behandelt wird, wie sie sollte.

Wie kann ich Service oder Broadcast warten lassen, bis die Fragmente erstellt sind, damit sie entsprechend behandelt werden?

Hier sind die relevanten Code-Schnipsel:

%Vor%     
tolgap 10.11.2012, 12:24
quelle

4 Antworten

3

Wie ich das behoben habe

Da ich einen Dienst für die Medienwiedergabe verwendete, wollte ich die zuletzt gehörten Songs vom Dienst abrufen, damit ich sie direkt abspielen konnte. Das war eine alte Logik, aber ich habe meinen Code dafür gebaut. Bis dahin stieß ich darauf rein.

Das passierte

  • FragmentActivity wird erstellt
  • Service wird gestartet und an
  • gebunden
  • Inzwischen wird Fragments asynchron erstellt
  • Sobald der Service startet, sendet er eine Broadcast mit den neuesten Informationen
  • Da die beiden Kreationen Service und Fragment asynchron sind, würde die Broadcast-Nachricht vom Service gesendet werden, aber weil die BroadcastReceivers in Fragments noch nicht initialisiert wurden, würden sie nicht empfangen das Intent .

Was ich getan habe, um es zu reparieren

Ich musste irgendwie einen Rückruf verwenden, der dafür sorgte, dass

  • Der Service wurde erstellt und an
  • gebunden
  • Die erstellten Fragmente und Ansichten werden festgelegt

Also habe ich ServiceConnection verwendet und um genau zu sein, die Methode onServiceConnected() . Dort habe ich die Voreinstellungen, in denen der letzte Song gespeichert wurde, und dann die Broadcast und die Fragments gesendet und die Views wurden entsprechend gesetzt. Dies funktionierte auch für Orientierungsänderungen.

Der Code

%Vor%     
tolgap 13.11.2012, 16:36
quelle
14

Am einfachsten wäre es, die Informationen zu behalten, bis das Fragment bereit ist, es anzuzeigen. Verwenden Sie die setArguments() -Methode des Fragments, um die Informationen an das Fragment anzuhängen.

%Vor%

Dann, in onCreateView() des Fragments, ziehen Sie einfach die Argumente von getArguments() und bauen Sie die Ansicht mit den Werten auf.

%Vor%

Eine andere Möglichkeit wäre, Setter-Methoden zu verwenden, bei denen das Fragment selbst Werte in ein Bündel für setArguments() legt. Auf diese Weise können Sie die Ansichten jedes Mal aktualisieren, wenn die Ansicht erstellt wurde, zusätzlich zu den Argumenten für das mögliche Ereignis, wenn die Ansicht des Fragments zerstört ist und neu erstellt werden muss.

Hinweis: Sie können setArguments() nur aufrufen, bevor das Fragment an die Aktivität angehängt wurde. Sie können jedoch das von setArguments übergebene Bundle aktualisieren, indem Sie einen Verweis darauf von getArguments() abrufen und dann einfach die Werte eingeben. Also, anstatt setArguments() von Ihrem Empfänger aus aufzurufen, tun Sie etwas wie folgt:

%Vor%     
DeeV 12.11.2012 14:44
quelle
0

Können Sie nicht etwas in dem Fragment wie

tun? %Vor%     
Marc Van Daele 12.11.2012 13:13
quelle
0

Meine Lösung bestand lediglich darin, eigene Callback-Interfaces zu erstellen. Ganz am Ende der onCreateView-Methode des ur-Fragments rufen Sie einfach Ihre Callback-Methode auf, die Ihrer Hauptaktivität mitteilt, dass die Erstellung abgeschlossen ist.

Es hat für mich funktioniert, die Hoffnung hilft dir auch.

    
Burak Soykal 29.06.2014 03:00
quelle