【正文】
一、接口回调的简单引入:
我们先来看一个简单的接口回调的例子:
新建一个java工程,然后新建一个包。然后新建一个a.java文件:
a.java代码如下:


第21至23行就是回调方法。
新建b.java,代码如下:


最后程序运行的结果如下:
关于接口回调,有一个博客,不过现在还不能完全理解,附上链接:
二、fragment和activity的交互:
1、在fragment中调用activity中的方法:
fragment可以通过getactivity()方法来获得activity的实例,然后就可以调用一些例如findviewbyid()之类的方法。例如:
但是注意调用getactivity()时,fragment必须和activity关联(attached to an activity),否则将会返回一个null。
另外,当碎片中需要使用context对象时,也可以使用getactivity()方法,因此获取到的活动本身就是一个context对象。
【实例】在activity的edittext中输入一段文本,这个时候,点击fragment中的按钮,让它弹出吐司,显示出对应的文本。
其实就是让activity中的文本显示在fragment中,fragment的核心代码如下:


第09行代码是核心,通过getactivity()方法来获得activity的实例,然后就可以调用findviewbyid()的方法得到其中的edittext控件。
2、在activity中调用fragment中的方法:(要用到接口回调)
activity也可以获得一个fragment的引用,从而调用fragment中的方法。获得fragment的引用要用fragmentmanager,之后可以调用findfragmentbyid() 或者 findfragmentbytag()。例如:
具体例子稍后再讲。
3、fragment与fragment之间的通信:
既然fragment和activity之间的通信问题解决了,那fragment与fragment之间的通信也没有那么复杂。基本思路是:
首先在一个fragment中可以得到与它相关联的activity,然后再通过这个activity去获取另外一个fragment的实例,这样就实现了不同fragment之间的通信。
三、创建事件回调(在activity中获取fragment中的值):
一些情况下,可能需要fragment和activity共享事件,一个比较好的做法是在fragment里面定义一个回调接口,然后要求宿主activity实现这个接口。当activity通过这个接口接收到一个回调,它可以让同布局中的其他fragment分享这个信息。
例如,一个新闻显示应用在一个activity中有两个fragment,一个fragment a显示文章题目的列表,一个fragment b显示文章。所以当一个文章被选择的时候,fragment a必须通知activity,然后activity通知fragment b,让它显示这篇文章。(例子的代码见官方文档)
我们现在举一个其他的例子:
【实例】在fragment中输入值,点击activity中的按钮,弹出吐司,显示之前输入的值。其实就是让fragment中的文本显示在activity中
我们在平板的左侧加入一个fragment,完整代码如下:
fragment_left.xml代码如下:


其实就是加了一个edittext,方便在里面输入文本内容。
然后在frament中加一个接口回调,让它在activity当中调用,方便获取输入文本的值。leftfragment.java的代码如下:


代码解释如下:
第25行:一定要为edittext加一个id,不然会报空指针异常的错误;
34至42行:添加一个接口回调,用于获取文本的值,然后稍后再activity当中进行调用。
activity_main.xml的代码如下:


其实一共就两个线性布局,左边的现性布局留给fragment,右边的线性性局留给activity。
mainactivity.java的代码如下:


我们在activity当中动态加载fragment,然后点击按钮,通过接口回调,获取fragment当中edittext的值,并弹出吐司。
程序运行后,在左侧的fragment的edittext当中输入值,点击右侧的按钮,弹出吐司,效果如下: