web-dev-qa-db-fra.com

Bus d'événement en fragment

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?

14
sanil

D'après votre question, deux problèmes peuvent être à l'origine du problème:

  1. Vous n'avez peut-être pas enregistré la EventBus dans votre classe FragmentOne comme vous l'avez fait pour votre classe DemoActivity.
  2. Si vous avez enregistré la 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.

12
Nitin Joshi

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 
    }

}
5
Md Imran Choudhury