最开始学Android的时候,Fragment与Activity之间的通信一直是比较让人头疼的部分。
所谓通信,其实就是要让Activity里的某些成员信息与Fragment共享(或者相反)。一个方法是借助回调接口,Fragment里定义一个接口由Activity实现,Fragment里获取Activity实例后强制转化为接口类型,再在需要的时候回调接口,完成通信。这么说比较抽象,以下是示例:
AFragment:
//定义一个接口
1 2 3 |
|
BActivity实现接口:
1 2 3 4 5 6 7 8 9 |
|
在Fragment里回调接口,实现通信:
1 2 |
|
这样就完成了一次通信。除了接口的方法,也可以通过广播来实现相同的效果,这里就不再阐述。
但是这些方法都有一个问题,既复杂,又会增大Activity与Fragment之间的耦合性。
为了解决这个问题,就出现了事件总线框架。这样的框架有很多,这里只讲一下EventBus。
事件总线基于观察者模式,如果了解这种设计模式会更好理解EventBus的使用。
在gradle里添加依赖:
1 |
|
使用时,首先定义一个事件类型。这个事件就是之后要在各个界面进行通信的载体:
1 2 3 4 5 6 7 8 9 10 11 |
|
接着在界面里注册订阅者:
1 |
|
在界面里添加订阅事件的动作:
1 2 3 4 |
|
最后是发布事件,事件发布后,所有订阅者都会接收到这个事件(执行之前添加的订阅动作):
1 2 3 |
|
借助这种方法,只要在Activity/Fragment里注册了订阅者并添加订阅动作,就能通过在别处发布事件来形成通信了。这样做降低了Activity/Fragment之间的耦合性。
解决方法:
按照cased by中提示,method改为public 并添加@Subscribe
-
@Subscribe
-
public void onEvent(MyEvent event) {
-
*******
-
}