在讲述Fragment的生命周期之前,我觉得有必要先对Fragment做一个简单的介绍,阅读英文文档没问题的同学,建议直接阅读官方文档,本人也是菜鸟,这边的简单介绍也只是对阅读过官方文档与查阅相关资料后做的一个简单的总结(所以还是建议阅读官方文档,毕竟每个人的理解会有所出入)。
Fragment简介
Fragment是一Activity中的一部分,我们可以把一个Activity分割成多个布局模块,每个布局模块对应一个Fragment,我们可以将各个布局模块以Fragment的形式模块化实现,再通过Fragment的管理体系动态的改变Activity的见面显示效果,是的Activity的界面显示更加灵活,并且Fragment可以被重复使用,这一点使用起来非常方便。同时,Fragment也为大屏应用的开发提供了新的天地,比如我们常见的Settings应用,在手机端需要两个Activity,而在TAB端的应用中,将两个Activity整合到了一个Activity中显示出来,其中就是通过Fragment实现的。官方文档上举了一个新闻应用的例子(如下图),在Tablet中,我们将FragmentA与FragmentB嵌入到ActivityA中,FragmentA显示的是新闻标题列表,FragmentB显示的是选中新闻标题对应的新闻内容,而如果我们需要将这个应用嵌入到手机中时,我们不需要重新开发,将之前的FragmentA潜入到ActivityA,将FragmentB嵌入到ActivityB中即可,达到了Fragment重用,缩短开发周期的效果,也为今后多显示屏的适配维护提供了便利。
Fragment生命周期
下面就是我们这篇文章的主要内容了,Fragment的生命周期。Fragment必须被潜入到Activity中使用,Fragment的生命周期与他所寄宿的Activity的生命周期是关联的。比如,当Activity Paused,该Acitvity中的所有Fragment都会Paused,当Activity Destroyed,该Activity中所有的Fragment都会Paused,当Activity正在运行中时,我们可以对Fragment进行自由操作,例如添加(Add),移除(Remove),替换(Replace)等等。在官方文档中,对于Fragment介绍那块我们会发现一下示意图,来阐明Fragment与Activity的生命周期的关系
Fragment用法
使用Fragment,我们必须使用创建一个Fragment子类的方式去使用Fragment,如上图发现,Fragment跟Activity有很多相似的地方,包含了很多回掉函数,这同样为Activity转换成Fragment提供了很多便利,通常,我们使用Fragment需要实现以下三个方法
onCreate:当创建Fragment的时候会调用这个方法,我们可以在这个方法中做一些组件的初始化工作。
onCreateView:当Fragment在Activity中显示的时候调用这个方法,该方法必须返回一个View(ListFragment不需要)。
onPause:与Activity相似,当Activity暂停时,就会调用它。
示例
下面,我们创建一个Android工程来阐明这个生命周期的关联。
1.在Eclipse中创建一个Android工程,命名为android_fragment_lifecycle.
2.在res/layout中添加一个布局文件,用于表示Fragment的布局情况,(我命名为ff.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"
android:gravity="center" >
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="I am a Fragment!"
android:gravity="center" />
</LinearLayout>
3.在主布局文件(默认activity_main.xml)中添加一个LinearLayout,为Fragment留下适当的空间,LinearLayout必须要定义ID属性
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<LinearLayout
android:id="@+id/line"
android:layout_width="match_parent"
android:layout_height="150dip"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginTop="150dip"
android:background="#FFFF0000"
android:orientation="vertical" >
</LinearLayout>
</RelativeLayout>
4.创建一个类,继承自Fragment,此处我定义的类名为Fragment,其实现如下所示,为每个方法都添加了Log输出
package com.example.android_fragment_lifetime;
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class MyFragment extends Fragment {
private final static String TAG = "MyFragment";
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
Log.e(TAG, "-MyFragment- onAttach ->>");
}
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
Log.e(TAG, "-MyFragment- onCreate ->>");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
Log.e(TAG, "-MyFragment- onCreateView ->>");
View view = inflater.inflate(R.layout.ff, null);
//return super.onCreateView(inflater, container, savedInstanceState);
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
Log.e(TAG, "-MyFragment- onActivityCreated ->>");
}
@Override
public void onStart() {
// TODO Auto-generated method stub
super.onStart();
Log.e(TAG, "-MyFragment- onStart ->>");
}
@Override
public void onResume() {
// TODO Auto-generated method stub
super.onResume();
Log.e(TAG, "-MyFragment- onResume ->>");
}
@Override
public void onPause() {
// TODO Auto-generated method stub
super.onPause();
Log.e(TAG, "-MyFragment- onPause ->>");
}
@Override
public void onStop() {
// TODO Auto-generated method stub
super.onStop();
Log.e(TAG, "-MyFragment- onStop ->>");
}
@Override
public void onDestroyView() {
// TODO Auto-generated method stub
super.onDestroyView();
Log.e(TAG, "-MyFragment- onDestroyView ->>");
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.e(TAG, "-MyFragment- onDestroy ->>");
}
@Override
public void onDetach() {
// TODO Auto-generated method stub
super.onDetach();
Log.e(TAG, "-MyFragment- onDetach ->>");
}
}
5.修改程序入口的Activity(默认为MainActivity)
package com.example.android_fragment_lifetime;
import android.os.Bundle;
import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.util.Log;
import android.view.Menu;
public class MainActivity extends Activity {
private final static String TAG = "MainActivity";
FragmentManager manager;
FragmentTransaction transaction;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(TAG, "-MainActivity- onCreate ->>");
manager = getFragmentManager(); //获取该Activity的FragmentManager
transaction = manager.beginTransaction(); //启动Fragment业务
MyFragment myFragment = new MyFragment();
transaction.add(R.id.line, myFragment); //添加一个操作业务,为指定区域添加一个Fragment
transaction.commit(); //提交Fragment的操作
}
@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
Log.e(TAG, "-MainActivity- onRestart ->>");
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
Log.e(TAG, "-MainActivity- onStart ->>");
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
Log.e(TAG, "-MainActivity- onResume ->>");
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
Log.e(TAG, "-MainActivity- onPause ->>");
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
Log.e(TAG, "-MainActivity- onStop ->>");
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.e(TAG, "-MainActivity- onDestroy ->>");
}
}
6.运行这个Android应用,发现程序中间潜入了我们的文本数据“I am a Fragment”
7.打开LogCat查看日志输出