Fragment的交互

最近项目以单个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交互

看了上面了我相信这个问题也没什么难度了。可以和上面的方式类似

ViewPager+Fragment连用时操作Fragment问题

这里传送门Update_Replace_Fragment_In_ViewPager

你可能感兴趣的:(Fragment的交互)