首页 > 代码库 > Fragment介绍

Fragment介绍

Fragment允许将Activity拆分成多个完全独立封装的可重用的组件,每个组件有它自己的生命周期和UI布局。

Fragment最大的优点就是你可以为不同屏幕大小的设备创建灵活动态的UI.

每个Fragment都是独立的模块,并与它所绑定的Activity紧密联系在一起的。多个Activity可以共用一个Fragment. Fragment为大量的不同型号、尺寸、分辨率的设备提供了一种统一的 UI优化方案。

可以通过继承Fragment类来创建一个新的Fragment.在大多数情况下,需要为Fragment分配一个UI,也可以为Activity创建一个没有任何UI但提供后台行为的Fragment.

和Activity不同,Fragment不需要在mainfest.xml文件中注册,这是因为Fragment只有嵌入到一个activity时,它才能够存在,它的生命周期也依赖于它所依赖的activity.

可以通过一个程序来观察其生命周期:

package com.example.myfragment;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class MainActivity extends Fragment {

	//调用该方法时Fragment会被连接到它的父Activity上
	@Override
	public void onAttach(Activity activity) {
		super.onAttach(activity);
		//获取对父Activity的引用
		Log.e("tag", "onAttach");
	}
	
	//调用该方法进行Fragment的初始创建
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//初始化Fragment
		Log.e("tag", "onCreate");
	}
	
	//一旦Fragment已被创建,要创建它自己的用户界面时调用的方法
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		//创建、或者填充Fragment的UI,并返回它
		//如果这个Fragment没有UI,那么返回null
		Log.e("tag", "onCreateView");
		return super.onCreateView(inflater, container, savedInstanceState);
	}
	
	//一旦父Activity和Fragment的UI已被创建,则调用该方法
	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		super.onActivityCreated(savedInstanceState);
		//完成Fragment的初始化,尤其是那些父Activity被初始化完成后或者Fragment的view被完全填充后才能做到事情
		Log.e("tag", "onActivityCreated");
	}
	
	//在可见生命周期的开始时被调用
	@Override
	public void onStart() {
		super.onStart();
		//应用所有的UI变化
		Log.e("tag", "onStart");
	}
	
	//在活动生命周期的开始时被调用
	@Override
	public void onResume() {
		super.onResume();
		//恢复所有暂停的Fragment需要的UI更新,线程或者进程,但在非活动状态时它是暂停的。
		Log.e("tag", "onResume");
	}
	
	//在活动周期结束时被调用
	@Override
	public void onPause() {
		//当Activity不是活动的前台Activity时,需要暂停UI的更新、挂起或者暂停那些不需要更新的CPU的集中处理。由于调用这个方法后,进程可能被终止,所有要保存所有的编辑和状态改变信息。
		super.onPause();
		Log.e("tag", "onPause");
	}
	
	//在活动生命周期结束时,调用该方法保存UI的状态
	@Override
	public void onSaveInstanceState(Bundle outState) {
		//这个outState会被传递到onCreate、onCreateView和onActivityCreate(如果它的父Activity被终止并且重新启动)方法中
		super.onSaveInstanceState(outState);
		Log.e("tag", "onSaveInstanceState");
	}
	
	//在可见生命周期结束时调用该方法
	@Override
	public void onStop() {
		//当Frament不可见时,暂停其余的UI更新、挂起线程或者暂停不再需要的处理 
		super.onStop();
		Log.e("tag", "onStop");
	}
	
	//当Fragment的view被分离时,调用该方法
	@Override
	public void onDestroyView() {
		//清除相关资源的view
		super.onDestroyView();
		Log.e("tag", "onDestroyView");
	}
	
	//在整个生命周期结束时调用该方法
	@Override
	public void onDestroy() {
		//清除所有的资源,包括结束线程和关闭数据库连接等
		super.onDestroy();
		Log.e("tag", "onDestroy");
	}
	
	//当Fragment从它的父Activity上分离时,调用该方法
	@Override
	public void onDetach() {
		super.onDetach();
		Log.e("tag", "onDetach");
	}

}
Fragment完整的生命周期开始于绑定到它的父Acitvity,结束于父Activity上分离。通过分别调用onAttach和onDetach来表示这些事件。

onAttach事件在Fragment的UI创建之前,以及Fragment自身或它的父Activity完成它们的初始化之前会被触发。通常情况下,onAttach事件用来获取一个Fragment的父Activity的引用,为进一步的初始化工作做准备。