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

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

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

原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2015-08-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android开发指南

Android MVP理解

3416
来自专栏非著名程序员

Base封装之我的最简MVP架构

绪论 最近懒癌症犯了,好久都没写博客了,当然也在做一些东西,也在整理自己一直以来使用的一些技术点,从Retrofit到OkGO,从ListView到Recycl...

2579
来自专栏向治洪

Android scrollview嵌套webview滑动冲突的解决方案

在Android开发中有时我们需要在scrollview中嵌套webview这时你会发现这两者的滑动事件产生了冲突导致:webview很难被滑动,即使被滑动了...

47510
来自专栏技术小黑屋

程序实现自己管理数据清理工作

How to disable system clear button and replace it with self application Manage S...

851
来自专栏Android干货

安卓开发_计时器(Chronometer)的简单使用

31111
来自专栏everhad

札记:Fragment基础

Fragment概述 在Fragment出现之前,Activity是app中界面的基本组成单位,值得一提的是,作为四大组件之一,它是需要“注册”的。组件的特性使...

1916
来自专栏非著名程序员

浅谈Andorid开发中的MVP模式

? 导语:最近公众号后台经常收到一些消息,说能不能讲一些开发模式,经过思考后,我决定讲一讲MVP模式。希望对大家能够有所帮助。并写了一个简单的小demo。 ...

2026
来自专栏Android干货

Android项目实战(十三):浅谈EventBus

3006
来自专栏分享达人秀

Fragment显示和隐藏、绑定和解绑

在上一期我们学习了FragmentManager和FragmentTransaction的作用,并用案例学习了Fragment的添加、移除和替换,本期一...

4557
来自专栏分享达人秀

Activity中启动和关闭其他Activity

上一期我们学习了Activity的创建和配置,当时留了一个悬念,如何才能在默认启动的Activity中打开其他新建的Activity呢?那么本期一起来学...

3055

扫码关注云+社区