Fragment 中的事件总线
Event Bus in Fragment
我创建了一个 Activity (DemoActivity.java) 和 2 个片段 (FragmentOne.java和 FragmentTwo.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 中创建相同的订阅者方法时,它不起作用。为什么?
从你的问题来看,可能有两件事导致了这个问题:
- 您可能没有像在
DemoActivity
class. 中那样在 FragmentOne
class 中注册 EventBus
- 如果您已经在
FragmentOne
class 中注册了 EventBus
那么请检查 FragmentOne
片段 class 是否存活并且处于接收状态从 FragmentTwo
class. 发布事件时的事件
编辑
从评论中可以看出,您已将 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)
}
我创建了一个 Activity (DemoActivity.java) 和 2 个片段 (FragmentOne.java和 FragmentTwo.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 中创建相同的订阅者方法时,它不起作用。为什么?
从你的问题来看,可能有两件事导致了这个问题:
- 您可能没有像在
DemoActivity
class. 中那样在 - 如果您已经在
FragmentOne
class 中注册了EventBus
那么请检查FragmentOne
片段 class 是否存活并且处于接收状态从FragmentTwo
class. 发布事件时的事件
FragmentOne
class 中注册 EventBus
编辑
从评论中可以看出,您已将 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)
}