前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Android基础】Fragment 详解之Fragment生命周期

【Android基础】Fragment 详解之Fragment生命周期

作者头像
程序员互动联盟
发布2018-03-14 11:58:23
1.3K0
发布2018-03-14 11:58:23
举报
文章被收录于专栏:程序员互动联盟
Fragment的主要功能就是创建一个View,并且有一个生命周期来管理这个View的创建和销毁。Fragment的生命周期与Activity的生命周期类似,都会有一些回调方法,你所做的工作就是利用好这些生命周期方法,在恰当的方法中做恰当的工作。

Fragment的生命周期与Activity的状态图如下:

左侧是Activity的生命周期状态,右侧对应的是这个状态下回执行Fragment的哪些生命周期方法。可以看到Fragment生命周期函数与Activity生命周期函数很多名字都是一样的,对应的功能也类似,只不过在Created状态和Destroyed状态比Activity增加了一些方法。下面就说一下这几个增加的生命周期方法:

  • onAttach(): 当fragment与它所在的Activity关联起来的时候调用。
  • onCreatView(): 当需要创建一个与Fragment关联的View时候会调用,这个方法会返回一个View,这个View会被添加到Activity的View树中,如果你不想Fragment显示一个View就返回null。
  • onDestroyView(): 当与Fragment关联的那个View(在onCreatView()方法中创建的)与Fragment解除关联,从View树中移除的时候调用,在下次Fragment需要显示一个View的时候会重新调用onCreatView方法。
  • onDetach(): 当Fragment与之前onAttach()是关联起来的那个Activity解除关系的时候调用。

与Activity类似,Fragment可以停留(长时间存在)的三个状态:

  • Resumed: Fragment的运行状态,此时Fragment处于运行状态,并且可以与用户之间进行交互,类似Activity的Resumed状态。
  • Paused: 有其他Activity获取焦点,前台运行,Fragment所在的Activity失去焦点,部分的显示在前台Activity下面。
  • Stopped: Fragment不再可见,此时的情形可能是Fragment所在的Activity已经stopped了,或者fragment从Activity中移除到Fragment回退栈中。一个Stopped状态的Fragment不没有被销毁,还在存活状态,它的状态和内部信息被系统记录和保存,只是不可见,不可交互,此时很可能会被系统回收。

与Activity类似,你可以利用Bundle来记录Fragment的状态,当Activity被销毁需要记录Fragment状态,并且在Activity重新创建的时候恢复Fragment的状态。你可以保存Fragment的状态在Fragment的onSaveInstanceState()回调方法中,在onCteat()、onCreatView()或者onActivityCreated()方法中进行恢复。

在生命周期中Activity与Fragment的最大不同之处是回退栈是相互独立的,Activity的回退栈是系统来管理的,Fragment的回退栈是被宿主Activity来管理的,也就是说你可以来进行控制(调用addToBackStack()).

注意:在Fragment中你如果要获取一个Context对象,你可以调用getActivity()方法,但是调用getActivity()方法必须要在Fragment于Activity关联起来之后,否则getActivity()返回为null。 上面说的都是Fragment的一些生命周期相关知识,下面来看看如何创建Fragment并且添加一个View给Fragment。

要想给Fragment添加一个View,你就必须重写onCreateView方法,在这个方法中创建一个View并且返回,这个View是Fragment的根View。在这个方法中系统给你提供了LayoutInflater对象,通过这个对象你可以从xml文件中创建一个View,代码如下:

代码语言:javascript
复制
publicstaticclassExampleFragmentextendsFragment{ 
    @Override 
    publicView onCreateView(LayoutInflaterinflater,ViewGroupcontainer,
                             BundlesavedInstanceState){
        // Inflate the layout for this fragment 
        returninflater.inflate(R.layout.example_fragment,container,false);
    } 
}

在onCreatView方法中container参数是一个ViewGroup,这个ViewGroup是从Activity传递过来的,是Fragment的View将要嵌入的那个父View。这里需要注意一下LayoutInflater的inflate函数,在这里第三个参数是false。

在这解释一下inflate的三个参数含义:

  • resource:是所要解析的layout文件ID;
  • root:一个ViewGroup,attachToRoot为true时会作为从xml文件解析出来的view的根View,如果attachToRoot为false时仅仅提供一些布局的参数给返回的rootView;
  • attachToRoot:决定解析的view是否会绑定到root参数提供的view上。

以上就是Fragment的生命周期和如何创建一个Fragment的View

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2015-08-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员互动联盟 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档