服务器之家

服务器之家 > 正文

Android基础之Fragment与Activity交互详解

时间:2021-02-04 14:25     来源/作者:Android开发网

今天继续讲解fragment组件的特性,主要是跟activity的交互和生命周期的关系,我们前面已经说过fragment是依赖于activity的,而且生命周期也跟activity绑定一起。下面我们看看fragment跟activity的关系。

1、为activity创建事件回调方法
在一些情况下, 你可能需要一个fragment与activity分享事件。 一个好的方法是在fragment中定义一个回调的interface, 并要求宿主activity实现它。当activity通过interface接收到一个回调, 必要时它可以和在layout中的其他fragment分享信息。例如, 如果一个新的应用在activity中有2个fragment – 一个用来显示文章列表(framgent a), 另一个显示文章内容(fragment b) – 然后 framgent a必须告诉activity何时一个list item被选中,然后它可以告诉fragmentb去显示文章。

在这个例子中, onarticleselectedlistener 接口在fragment a中声明:

复制代码 代码如下:

public static class fragmenta extends listfragment
{
    //...
    // container activity must implement this interface
    public interface onarticleselectedlistener {
        public void onarticleselected(uri articleuri);
    }
    //...
}


然后fragment的宿主activity实现 onarticleselectedlistener 接口,并覆写 onarticleselected() 来通知fragment b,从fragment a到来的事件。为了确保宿主activity实现这个接口, fragment a的 onattach() 回调方法(当添加fragment到activity时由系统调用) 通过将作为参数传入onattach()的activity做类型转换来实例化一个onarticleselectedlistener实例。

复制代码 代码如下:

public static class fragmenta extends listfragment
{
    onarticleselectedlistener mlistener;
    //...
    @override
    public void onattach(activity activity) {
        super.onattach(activity);
        try {
            mlistener = (onarticleselectedlistener) activity;
         } catch (classcastexception e) {
            throw new classcastexception(activity.tostring() + " must implementonarticleselectedlistener");
        }
    }
    //...
}


如果activity没有实现接口,fragment会抛出 classcastexception 异常。正常情形下,mlistener成员会保持一个到activity的onarticleselectedlistener实现的引用,因此fragment a可以通过调用在onarticleselectedlistener接口中定义的方法分享事件给activity。例如,如果fragment a是一个 listfragment的子类, 每次用户点击一个列表项,系统调用在fragment中的onlistitemclick(),然后后者调用 onarticleselected() 来分配事件给activity。

复制代码 代码如下:

public static class fragmenta extends listfragment
{
    onarticleselectedlistener mlistener;
    //...
    @override
    public void onlistitemclick(listview l, view v, int position, long id) {
        // append the clicked item's row id with the content provider uri
         uri noteuri =contenturis.withappendedid(articlecolumns.content_uri, id);
        // send the event and uri to the host activity
       mlistener.onarticleselected(noteuri);
    //...
}


传给 onlistitemclick() 的 id 参数是被点击的项的行id,activity(或其他fragment)用来从应用的 contentprovider 获取文章。

2、添加项目到actionbar
你的fragment可以通过实现 oncreateoptionmenu() 提供菜单项给activity的选项菜单(以此类推, action bar也一样)。为了使这个方法接收调用,无论如何,你必须在 oncreate() 期间调用 sethasoptionsmenu() 来指出fragment愿意添加item到选项菜单(否则, fragment将接收不到对 oncreateoptionsmenu()的调用)。

 

随后从fragment添加到option菜单的任何项,都会被追加到现有菜单项的后面。当一个菜单项被选择,fragment也会接收到 对 onoptionsitemselected() 的回调。也可以在你的fragment layout中通过调用registerforcontextmenu() 注册一个view来提供一个环境菜单。当用户打开环境菜单,fragment接收到一个对 oncreatecontextmenu() 的调用.当用户选择一个项目, fragment接收到一个对oncontextitemselected() 的调用。

注意: 尽管你的fragment会接收到它所添加的每一个菜单项被选择后的回调,但实际上当用户选择一个菜单项时,activity会首先接收到对应的回调。如果activity的on-item-selected回调函数实现并没有处理被选中的项目,然后事件才会被传递到fragment的回调。

这个规则适用于选项菜单和环境菜单。

3、处理fragment的生命周期
管理fragment的生命周期, 大多数地方和管理activity生命周期很像.和activity一样, fragment可以处于3种状态:
   resumed
        在运行中的activity中fragment可见。
   paused
        另一个activity处于前台并拥有焦点,但是这个fragment所在的activity仍然可见(前台activity局部透明或者没有覆盖整个屏幕)。
   stopped
        要么是宿主activity已经被停止, 要么是fragment从activity被移除但被添加到后台堆栈中。
        停止状态的fragment仍然活着(所有状态和成员信息被系统保持着)。然而,它对用户不再可见,并且如果activity被干掉,他也会被干掉。
其对应关系图如下:

Android基础之Fragment与Activity交互详解

和activity一样, 你可以使用bundle保持fragment的状态,万一activity的进程被干掉,并且当activity被重新创建的时候, 你需要恢复fragment的状态时就可以用到. 你可以在fragment的 onsaveinstancestate() 期间保存状态,并可以在 oncreate(),oncreateview() 或 onactivitycreated() 期间恢复它。

生命周期方面activity和fragment之间最重要的区别是各自如何在它的后台堆栈中储存。 在默认情况下,activity在停止后,它会被放到一个由系统管理的用于保存activity的后台堆栈。(因此用户可以使用back按键导航回退到它)。

然而,仅当你在一个事务期间移除fragment时,显式调用addtobackstack()请求保存实例时,才被放到一个由宿主activity管理的后台堆栈。

另外,管理fragment的生命周期和管理activity生命周期非常类似。因此, "managing the activitylifecycle"中的相同实践也同样适用于fragment。你需要理解的是,activity的生命如何影响fragment的生命。

4、与activity生命周期的协调工作
fragment所生存的activity的生命周期,直接影响fragment的生命周期,每一个activity的生命周期的回调行为都会引起每一个fragment中类似的回调。

例如,当activity接收到onpause()时,activity中的每一个fragment都会接收到onpause()。

fragment 有一些额外的生命周期回调方法,那些是处理与activity的唯一的交互,为了执行例如创建和销毁fragment的ui的动作。这些额外的回调方法是:

•onattach()
当fragment被绑定到activity时被调用(activity会被传入)
•oncreateview()
创建和fragment关联的view hierarchy时调用
•onactivitycreated()
当activity的oncreate()方法返回时被调用
•ondestroyview()
当和fragment关联的view hierarchy正在被移除时调用
•ondetach()
当fragment从activity解除关联时被调用
fragment生命周期的流程,以及宿主activity对它的影响,在图3中显示。在这个图中,可以看到activity依次的每个状态是如何决定fragment可能接收到的回调方法。例如,当activity接收到它的oncreate(),activity中的fragment接收到最多是onactivitycreated()。
一旦activity到达了resumed状态,你可以自由地在activity添加和移除fragment。因此,仅当activity处于resumed状态时, fragment的生命周期才可以独立变化。
无论如何,当activity离开resumed状态,fragment再次被activity的推入它自己的生命周期过程。

5、总结
fragment的相关知识暂时就讲到这里,例子demo可以直接看apidemo里面的程序,如果不知道api demo在哪里,请百度!学编程需要自己学会找答案。

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
Intellij idea2020永久破解,亲测可用!!!
Intellij idea2020永久破解,亲测可用!!! 2020-07-29
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
返回顶部