18

我创建了一个带有 2 个片段(FragmentOne.javaFragmentTwo.java )的活动( DemoActivity.java)。

EventBus像这样在活动中注册了EventBus.getDefault().register(this);

并在 Activity 中创建了一个 Suscriber 方法:

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

然后我在按钮单击时从 FragmentTwo.java 发布一个事件EventBus.getDefault().post("");

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

4

3 回答 3

17

根据您的问题,可能有两件事导致该问题:

  1. 您可能没有像EventBusFragmentOne课堂上那样在课堂上注册DemoActivity
  2. 如果您已 EventBusFragmentOne班级中注册,请检查FragmentOne片段班级是否处于活动状态并处于接收事件的状态,同时从FragmentTwo班级发布事件。

编辑

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

于 2017-03-10T07:56:18.657 回答
8

对片段使用粘性事件。因为片段有时会加载多个偏移量。

注册和注销您的 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 发布事件.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 
    }

}
于 2018-04-13T14:04:48.083 回答
0

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

  override fun onStart() {
    super.onStart()
    EventBus.getDefault().register(this)
}
于 2021-12-15T10:27:06.020 回答