Связь EventBus между двумя фрагментами показывает, что для класса событий не зарегистрированы подписчики..?

Впервые я пытаюсь внедрить EventBus для обмена двумя фрагментами MyActivity (чтобы изменить button.setEnabled) моего SDK 21

это мое событие POJO

public class ButtonEvent {

public final boolean status;
public ButtonEvent(boolean status){

    this.status=status;
}

}

это фрагмент, который запускает событие...

Fragment A
...//some code
 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_a, container, false);
...//more code inside onCreateView
  btnChange.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
//HERE I POST THE EVENT
            EventBus.getDefault().post(new ButtonEvent(true));
}

вот фрагментB, который получает (прослушивает) событие...

FragmentB extends Fragment{
...//some code
@Override
// in method onCreate I register the subscriber
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if(!EventBus.getDefault().hasSubscriberForEvent(ButtonEvent.class)) {
        EventBus.getDefault().register(this);
    }

}
 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_b, container, false);
//...some other code
}
//HERE IS MI SUBSCRIBER
@Subscribe
public void onEvent(ButtonEvent event){

    btnNuevoMed.setEnabled(event.status);
    btnNuevoMed.setText("hELLOOO");
}

это мой вывод, но приложение не останавливается, но не вносит никаких изменений в мою кнопку фрагментаB:

D/EventBus: No subscribers registered for event class ar.com.titaves.consultoriosapp.servicios.ButtonEvent
D/EventBus: No subscribers registered for event class org.greenrobot.eventbus.NoSubscriberEvent

моя версия шины событий:

compile 'org.greenrobot:eventbus:3.0.0'

есть похожие вопросы, но на некоторые из них нет правильного ответа, а другие - разные ситуации. Фрагмент активности - это не та же реализация, что и фрагмент для кадра.

Мой код правильный? Я что-то упускаю? Почему это не работает и как я могу Решить проблему? заранее спасибо...


person matQ    schedule 02.08.2017    source источник
comment
Я думаю, вы забыли создать подписчика для FragmentA, пожалуйста, посмотрите.   -  person Sachin Varma    schedule 02.08.2017
comment
@SachinVarma оба фрагмента должны создавать подписчика, а не только прослушиваемый фрагмент B? не могли бы вы показать мне, как и где его кодировать, пожалуйста?   -  person matQ    schedule 02.08.2017
comment
да, вам также нужно создать подписчика для фрагмента A   -  person Sachin Varma    schedule 02.08.2017


Ответы (1)


Вот образец..

          Fragment A
            ...//some code
             @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                     Bundle savedInstanceState) {
                View rootView = inflater.inflate(R.layout.fragment_a, container, false);
            ...//more code inside onCreateView
              btnChange.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
            //HERE I POST THE EVENT
                        EventBus.getDefault().post(new ButtonEvent(true));
            }
});
}

        @Subscribe
        public void onEvent(ButtonEvent event){

        }

    @Override
      public void onStart() {
        super.onStart();
        if (!EventBus.getDefault().isRegistered(getActivity())) {
          EventBus.getDefault().register(this);
        }
      }

      @Override
      public void onStop() {
        super.onStop();
        EventBus.getDefault().unregister(this);
      }

Фрагмент Б:

    FragmentB extends Fragment{
    ...//some code
    @Override
    // in method onCreate I register the subscriber
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }
     @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_b, container, false);
    //...some other code
    }
    //HERE IS MI SUBSCRIBER
    @Subscribe
    public void onEvent(ButtonEvent event){

        btnNuevoMed.setEnabled(event.status);
        btnNuevoMed.setText("hELLOOO");
    }
 @Override
      public void onStart() {
        super.onStart();
        if (!EventBus.getDefault().isRegistered(getActivity())) {
          EventBus.getDefault().register(this);
        }
      }

      @Override
      public void onStop() {
        super.onStop();
        EventBus.getDefault().unregister(this);
      }
person Sachin Varma    schedule 02.08.2017
comment
Я пробую ваш код, проблема вывода решена (Нет подписчиков, зарегистрированных для класса событий..) ошибок нет, НО моя кнопка не обновляется с enable(false) на true, я знаю, что это другая проблема, но вы знаете, почему мой фрагментB не обновляет статус моей кнопки или не обновляет фрагмент? Спасибо, в любом случае - person matQ; 02.08.2017
comment
или я должен добавить некоторый код в метод подписчика фрагмента? или просто оставить его пустым? потому что ошибок нет но ничего не происходит и меняется - person matQ; 02.08.2017