Шина событий во фрагменте
Я создал одну активность ({5]} Демоактивность.java ) С 2 фрагментами (FragmentOne.java и FragmentTwo.java ).
Я зарегистрировал EventBus в деятельности, подобной этой EventBus.getDefault().register(this);
И создал один метод Suscriber в своей деятельности:
@Subscriber
public void abc(String str) {
Log.i(TAG,"MainActivity Called !!");
}
Затем я публикую событие из FragmentTwo.java on button click EventBus.getDefault().post("");
Этот сценарий прекрасно работает для меня. Но когда я создаю тот же метод подписчика в FragmentOne.java это не работает. Почему?
2 ответов:
Из вашего вопроса могут быть две вещи, которые вызывают проблему:
- Возможно, вы не зарегистрировали
EventBusв своем классеFragmentOne, Как вы это сделали для своего классаDemoActivity.- Если вы зарегистрировали
EventBusв классеFragmentOne, то, пожалуйста, проверьте, еслиFragmentOneкласс фрагмента жив и находится в состоянии получить событие, отправляя событие из классаFragmentTwo.Edit
Как видно из комментариев, Вы зарегистрировали свой
EventBusкакEventBus.getDefault().register(getActivity())из-за этого регистрироваться будет только ваша деятельность. Для регистрации вашегоFragmentИспользуйтеEventBus.getDefault().register(this)в вашем методеFragment.onCreate().
Используйте липкие события для фрагмента. Потому что фрагменты загружаются многократными смещениями некоторое время.
Регистрация и отмена регистрации шины событий:
@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); }OnChildChange.событие класса post с
.postSticky():EventBus.getDefault().postSticky(new OnChildChange(position));Подписаться на EventBus с помощью
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 } }
Comments