Fragment 中的事件总线

Event Bus in Fragment

我创建了一个 Activity (DemoActivity.java) 和 2 个片段 (FragmentOne.javaFragmentTwo.java).

我在Activity中注册了EventBus是这样的EventBus.getDefault().register(this);

并在 Activity 中创建了一个订阅者方法:

@Subscriber
public void abc(String str) {
    Log.i(TAG,"MainActivity Called !!");
}

然后我 post 来自 FragmentTwo.java 的事件点击按钮 EventBus.getDefault().post("");

这个场景对我来说很好。但是当我在 FragmentOne.java 中创建相同的订阅者方法时,它不起作用。为什么?

从你的问题来看,可能有两件事导致了这个问题:

  1. 您可能没有像在 DemoActivity class.
  2. 中那样在 FragmentOne class 中注册 EventBus
  3. 如果您已经在 FragmentOne class 中注册了 EventBus 那么请检查 FragmentOne 片段 class 是否存活并且处于接收状态从 FragmentTwo class.
  4. 发布事件时的事件

编辑

从评论中可以看出,您已将 EventBus 注册为 EventBus.getDefault().register(getActivity()),因此只有您的 Activity 会被注册。要注册您的 Fragment,请在您的 Fragment.onCreate() 方法中使用 EventBus.getDefault().register(this)

对片段使用Sticky Events。因为片段有时会加载多个偏移量。

Register and unregister your 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);
}

OnChildChange.class post event with .postSticky():

EventBus.getDefault().postSticky(new OnChildChange(position));

Subscribe EventBus with 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 
    }

}

您必须在片段中的 OnStart() 处注册 EventBus。

  override fun onStart() {
    super.onStart()
    EventBus.getDefault().register(this)
}