一个Activity可以同时组合多个Fragment,一个Fragment也可被多个Activity 复用。Fragment可以响应自己的输入事件,并拥有自己的生命周期,但它们的生命周期直接被其所属的Activity的生命周期控制。
一、Fragment状态
与Activity类似的是,Fragment也存在如下4种状态:
-
运行状态:当前Fmgment位于前台,用户可见,可以获得焦点。
-
暂停状态:其他Activity位于前台,该Fragment依然可见,只是不能获得焦点。
-
停止状态:该Fragment不可见,失去焦点。
-
销毁状态:该Fragment被完全删除,或该Fragment所在的Activity被结束。
结合之前学习Activity的状态,理解Fragment的状态非常简单。
很多地方都在说明 Fragment有三个状态,包括官方文档没有提到Fragment的 销毁状态。这也是合理的,因为处于销毁状态的Fragment基本不可用了,只能等着被回收。
二、Fragment生命周期
Fragment的生命周期与Activity的生命周期十分相似,如下图所示:
从上图可以看出,Activity中的生命周期方法,Fragment中基本都有,但是Fragment比Activity多几个方法。各生命周期方法的含义如下:
-
onAttach():当该Fragment被添加到Activity时被回调。该方法只会被调用一次。
-
onCreate(Bundle savedStatus):创建Fragment时被回调。该方法只会被调用一次。
-
onCreateView():每次创建、绘制该Fragment的View组件时回调该方法,Fragment将会显示该方法返回的View 组件。
-
onActivityCreated():当 Fragment 所在的Activity被启动完成后回调该方法。
-
onStart():启动 Fragment 时被回调。
-
onResume():恢复 Fragment 时被回调,在onStart()方法后一定会回调 onResume()方法。
-
onPause():暂停 Fragment 时被回调。
-
onStop():停止 Fragment 时被回调。
-
onDestroyView():销毁该 Fragment 所包含的View组件时调用。
-
onDestroy():销毁 Fragment 时被回调。 该方法只会被调用一次。
-
onDetach():将该 Fragment 从Activity中删除、替换完成时回调该方法,在onDestroy()方法后一定会回调 onDetach()方法。该方法只会被调用一次。
正如开发Activity时可以根据需要有选择性地覆盖指定方法一样,开发Fragment时也可根据需要有选择性地覆盖指定方法。其中最常见的就是覆盖onCreateView()方法——该方法返回的View将由Fragment显示出来。
三、示例验证
为了掌握Fragment生命周期,接下来通过案例 “Fragment生命周期”来学习。本案例实现了一个Activity加载了一个Fragment,具体步骤如下:
首先创建一个布局文件fragment_lifecycle.xml,在其中简单添加一个文本框,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="Fragment生命周期"
android:textColor="#1418e6"
android:textSize="18sp"/>
</LinearLayout>
新建一个LifeCycleFragment类,继承Fragment基类,并重写其全部生命周期方法,并在每一个生命周期方法里面将对应的方法名输出到Logcat,代码如下:
package com.jinyu.cqkxzsxy.android.fragmentlifecycle;
import android.app.