天天看点

Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)

【正文】

一、接口回调的简单引入:

我们先来看一个简单的接口回调的例子:

新建一个java工程,然后新建一个包。然后新建一个a.java文件:

a.java代码如下:

Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)
Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)

第21至23行就是回调方法。

新建b.java,代码如下:

Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)
Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)

最后程序运行的结果如下:

Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)

关于接口回调,有一个博客,不过现在还不能完全理解,附上链接:

二、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的核心代码如下:

Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)
Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)

第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代码如下:

Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)
Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)

其实就是加了一个edittext,方便在里面输入文本内容。

然后在frament中加一个接口回调,让它在activity当中调用,方便获取输入文本的值。leftfragment.java的代码如下:

Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)
Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)

代码解释如下:

第25行:一定要为edittext加一个id,不然会报空指针异常的错误;

34至42行:添加一个接口回调,用于获取文本的值,然后稍后再activity当中进行调用。

activity_main.xml的代码如下:

Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)
Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)

其实一共就两个线性布局,左边的现性布局留给fragment,右边的线性性局留给activity。

mainactivity.java的代码如下:

Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)
Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)

我们在activity当中动态加载fragment,然后点击按钮,通过接口回调,获取fragment当中edittext的值,并弹出吐司。

程序运行后,在左侧的fragment的edittext当中输入值,点击右侧的按钮,弹出吐司,效果如下:

Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)

继续阅读