J'ai créé une activité (DemoActivity.Java) avec 2 fragments (FragmentOne.Java et FragmentTwo.Java).
J'ai enregistré le EventBus
dans l'activité comme ceciEventBus.getDefault().register(this);
et créé une méthode Suscriber dans l'activité:
@Subscriber
public void abc(String str) {
Log.i(TAG,"MainActivity Called !!");
}
Ensuite, je poste un événement de FragmentTwo.Java sur le bouton, cliquez sur EventBus.getDefault().post("");
Ce scénario me convient parfaitement. Mais lorsque je crée la même méthode d'abonné dans FragmentOne.Java, cela ne fonctionne pas. Pourquoi?
D'après votre question, deux problèmes peuvent être à l'origine du problème:
EventBus
dans votre classe FragmentOne
comme vous l'avez fait pour votre classe DemoActivity
.EventBus
dans la classe FragmentOne
, veuillez vérifier si la classe de fragment FragmentOne
est vivante et en état de recevoir l'événement lors de la publication de l'événement à partir de FragmentTwo
classe.Éditer
Comme le montrent les commentaires, vous avez enregistré votre EventBus
en tant que EventBus.getDefault().register(getActivity())
pour cette raison, seule votre activité sera enregistrée. Pour enregistrer votre Fragment
utilisez EventBus.getDefault().register(this)
dans votre Fragment.onCreate()
méthode.
Utilisez Sticky Events pour le fragment. Parce que les fragments sont chargés plusieurs décalages un certain temps.
Enregistrez et désinscrivez votre Eventbus:
@Override
public void onStart() {
Log.d(TAG, "Register ");
EventBus.getDefault().register(this);
super.onStart();
}
@Override
public void onStop() {
super.onStop();
Log.d(TAG, "Unregister");
EventBus.getDefault().unregister(this);
}
Événement de publication OnChildChange.class avec
.postSticky()
:
EventBus.getDefault().postSticky(new OnChildChange(position));
Abonnez-vous à EventBus avec
sticky = true
:
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onCategoryChangeEvent(OnChildChange event){
// get the event and remove drom sticky
OnChildChange stickyEvent = EventBus.getDefault().removeStickyEvent(OnChildChange.class);
if(stickyEvent != null) {
// apply your logic or call methods
}
}