最近项目以单个Activity+Fragment来完成,Fragment的各种用法是略不过的,上篇已经推荐了一个Fragment管理的开源库Fragmentation,这次在项目的新版中用到了,还是非常好用的。今天主要记录一下Fragment的交互方式。
Fragment与Activity之间的交互
Often you will want one Fragment to communicate with another, for example to change the content based on a user event. All Fragment-to-Fragment communication is done through the associated Activity. Two Fragments should never communicate directly.
谷歌官方教程的一段话,大致意思就是:所有的fragment与fragment之间的交互都需要通过宿主activity来实现,fragment与fragment不应该直接交互。
Fragment与activity之间的交互有以下几种方式:
1.通过getActivity()强转直接调用方法
这种方法比较简单粗暴,直接通过在Fragment的onAttach(Context context)
强转成宿主activity的类型,然后在需要调用的时候直接调用((AssociatedActivity)getActivity).someMethod()
。
这种方式能达到要求,但是发没发现耦合度太高了?大家都知道Fragment的出现是为了复用和适配大屏幕。如果这个Fragment在别的功能也使用了,当宿主Activity变化的时候就不是我们想要的了。当然我们可以在onAttach()
方法中判断,不过这样显然不妥。
2.同过定义Interface与Activity交互
这种方式是官方示例的写法,我也比较倾向这种写法。
首先定义一个接口(interface),然后在onAttach()
方法中去绑定。
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()+ " must implement OnFragmentInteractionListener");
}```
OnFragmentIntercationListener是你自己定义的接口。绑定完就可以在你需要的地方调用了。比如:
```java
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_interface_two:
mListener.onFragmentInteraction(2);
break;
}}
这是在点击按钮的时候调用了interface的方法,以上是Fragment部分的代码。下面是Activity中的代码:
首先Activity要实现定义的接口,即本例中的OnFragmentInteractionListener,然后实现接口中的方法。
@Override
public void onFragmentInteraction(int position) {
//do something
}
这样就可以调用了,还是挺简单的吧~
3.EventBus
这种就不多说了~不会用有点说不过去。
4.FABridge
这个是鸿洋大神的开源库,请移步至FABridge,这个用起来相当简单,简化了许多代码。
父Fragment与子Fragment交互
看了上面了我相信这个问题也没什么难度了。可以和上面的方式类似
网友评论