Attendez que l'opération jusqu'à ce Fragment de Vues sont créées
Je suis de la programmation d'un Lecteur de Musique et la Musique joue en arrière-plan Service
. Lorsque l'utilisateur tue le Activity
qui accueille 3 Fragments
, puis redémarre le Activity
encore une fois, j'ai envoyer un Broadcast
de la Service
qui contient des informations sur le morceau en cours, et la liste des chansons que l'utilisateur ajoute à sa session.
Le problème est, à chaque fois que je veux régler les dernières informations dans les Fragments
il ne se passe rien parce que leur création prend trop de temps, et le Broadcast
n'obtient pas traités comme ils le devraient.
Comment puis-je laisser le Service
ou la Broadcast
attendre jusqu'à ce que les Fragments sont créés de telle sorte qu'ils sont gérés de manière appropriée?
Voici les extraits de code:
//When the activity binds to the service, refresh the fragments
private ServiceConnection conn = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
LocalBinder binder = (LocalBinder) service;
myService = binder.getService();
myService.setBound(true);
if(myService.startedOnce) {
myService.refreshFragments();
}
myService.startedOnce = true;
}
}
//This is the broadcast receiver of the Fragment
//it receives the broadcast too soon, and I can't set the
//Views so they are always empty.
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(MusicService.REFRESH_ALL)) {
Song current = intent.getParcelableExtra("song");
setCurrentSong(current);
}
}
OriginalL'auteur tolgap | 2012-11-10
Vous devez vous connecter pour publier un commentaire.
La meilleure chose à faire serait tout simplement tenir à l'information jusqu'à ce que le Fragment est prêt pour l'afficher. Utiliser le Fragment de la
setArguments()
méthode pour joindre les informations dans le Fragment.Puis, dans le Fragment de la
onCreateView()
il suffit de tirer les arguments degetArguments()
et construire le point de vue avec les valeurs.Une autre façon de faire serait d'utiliser des méthodes de définition dans laquelle le Fragment lui-même met les valeurs dans un Bundle pour
setArguments()
. De cette façon, vous pouvez mettre à jour les points de vue à chaque fois que la Vue a été créée sur le dessus de la définition de la arguments pour l'événement possible lorsque le Fragment de la Vue est détruite et doit être recréé.Remarque: Vous pouvez uniquement appeler
setArguments()
avant le Fragment a été affecté à l'Activité. Vous pouvez cependant mettre à jour le paquet que vous passez parsetArguments
par la récupération d'une référence à partir degetArguments()
, puis il suffit de mettre dans les valeurs. Donc, au lieu de l'appelersetArguments()
de votre récepteur, faire quelque chose comme ceci:qu'est-ce que
getUsingFragment()
? Cette méthode n'existe pas pour la v4Fragment
ni le stockFragment
classe.Désolé. J'ai oublié de préciser. Il n'existe pas. C'est tout simplement quelle que soit la méthode que vous utilisez pour obtenir le fragment. Vous pouvez remplacez la par
findFramgentByTag()
ou quelle que soit la méthode que vous avez à récupérer le fragment que vous souhaitez mettre à jour. J'ai essayé de le rendre plus général, car il y a plusieurs façons de récupérer un fragment.J'ai fait réparé mon problème en déplaçant tous fragment de code de création de la
ServiceConnection
intérieur de la classe dans monFragmentActivity
. Il a assuré que tous les fragments ont été créés et le service a été lancé. Je ne suis pas sûr de la réponse à l'accepter maintenant.Vous ne pouvez pas accepter votre propre réponse, mais il serait mieux de répondre à votre propre question avec la solution que vous avez utilisé dans le cas où quelqu'un d'autre le trouve.
OriginalL'auteur DeeV
Comment j'ai résolu ce
Comme je l'ai été en utilisant un Service de support de Lecture, je voulais apporter dernières chansons écoutées par le service afin que je puisse jouer directement. C'était d'une logique ancienne, mais j'en ai construit mon code autour d'elle. Jusqu'à ce que jusqu'à maintenant j'ai heurté.
Ce qui se passait
FragmentActivity
est crééService
se met en marche et lié àFragments
créés de manière asynchroneService
démarre, il envoie unBroadcast
avec les dernières informationsService
et laFragment
créations sont asynchrones, l'émission sera envoyé par le service, mais parce que leBroadcastReceivers
dans leFragments
n'étaient même pas encore initialisés, ils ne recevraient pas laIntent
.Ce que j'ai fait pour le fixer
J'ai un peu eu à utiliser un rappel qui fait en sorte que
J'ai donc utilisé le
ServiceConnection
et pour être précis, leonServiceConnected()
méthode. Là, j'ai eu les préférences dans lequel la dernière chanson a été enregistrée, puis envoyer leBroadcast
et laFragments
l'a reçu, et leViews
ont été appropiately ensemble. Ça marchait aussi pour les changements d'orientation de l'.Le code
OriginalL'auteur tolgap
Ne pouvez-vous pas faire quelque chose dans le fragment comme
onResume()
lacurrent
variable est null ce qui provoqueNPE
, et si j'ai vérifier la valeur null, il ne va pas ensemble. C'est parce que j'ai envoyer leBroadcast
de laService
, qui n'a pas encore terminé l'envoi de laditeBroadcast
.Ainsi, le onReceive est reçue après la onResume apparemment. Selon le fragment du cycle de vie developer.android.com/guide/components/fragments.html#Lifecycle, tous les points de vue devraient avoir été créés lors de l'appel onResume (et à plus forte raison lorsque onReceive est appelé). Pouvez-vous élaborer sur ce qui va mal lors de l'appel de setCurrentSong de l'intérieur onReceive? Le point de Vue doit exister afaics.
J'ai déplacé tous les fragments liés à la création du code de la
onServiceConnection()
de laFragmentActivity
et le seul qui fixe l'ordre dans lequel tout fonctionne. Si votre hypothèse que le Fragment de laBroadcastReceiver
premier reçoit la diffusion et se déplace ensuite à laonResume()
est techniquement faux.Mon hypothèse était basée sur votre commentaire dans le code indiquant "qu'il reçoit de la diffusion trop tôt, et je ne peux pas définir le point de Vue de sorte qu'ils sont toujours vides." ce qui suggère que le onReceive a été appelé avant les points de vue ont été créés. Le premier test (deux premiers commentaires ici) indiquent en effet que la onReceive est appelée après la onResume.
Oui, mais comme je faisais quelque chose de mal, mes commentaires ont été mal aussi 😉 Donc, je suis désolé mais je ne peux pas accepter cela comme une réponse, pour quelqu'un d'autre pourrait essayer de mettre en œuvre ce code et il ne pourrait pas fonctionner totalement.
OriginalL'auteur Marc Van Daele
ma solution était tout simplement de créer vos propres interfaces de rappel. À la fin de onCreateView méthode d'ur fragment il suffit d'appeler votre méthode de rappel, qui raconte ur mainactivity que la création est faite.
Il a travaillé pour moi, l'espoir aide à u trop.
OriginalL'auteur Burak Soykal