如果你是在Android 3.0 Honeycomb上开发,并且API级别是11或更高版本,就可以使用Fragment API。但是,如果你倾向于在Honeycomb之前的Android版本上开发,而且想要在用户界面中使用Fragment对象,则可以使用Android Compatibility Package,如第7章所描述的。本章的示例代码是通过两种方式提供的:一种是把API级别11作为目标API,另一种可以是API级别4以上的任何级别的API,和Android 1.6对应。你会发现它们的Fragment代码是完全相同的,唯一区别在于Fragment类的包声明不一样,而且它和Fragment生命周期行为完全相同。
这部分代码和之前的Activity类类似,演示了生命周期调用,可以在程序运行时观察它们:
package com.oreilly.demo.pa.ch10.finchlifecycle;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 TestFragment extends Fragment { // get a label for our log entries private final String TAG = this.getClass.getSimpleName; public TestFragment { } @Override public void onAttach(Activity activity) {① super.onAttach(activity); Log.i(TAG, /"onAttach/"); } @Override public void onCreate(Bundle saved) {② super.onCreate(saved); if (null != saved) { // Restore state here } Log.i(TAG, /"onCreate/"); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,③ Bundle saved) { View v = inflater.inflate(R.layout.fragment_content, container, false); Log.i(TAG, /"onCreateView/"); return v; } @Override public void onActivityCreated(Bundle saved) {④ super.onActivityCreated(saved); Log.i(TAG, /"onActivityCreated/"); } @Override public void onStart {⑤ super.onStart; Log.i(TAG, /"onStart/"); } @Override public void onResume {⑥ super.onResume; Log.i(TAG, /"onResume/"); } @Override public void onPause {⑦ super.onPause; Log.i(TAG, /"onPause/"); } @Override public void onStop {⑧ super.onStop; Log.i(TAG, /"onStop/"); } // //////////////////////////////////////////////////////////////////////////// // Called during the life cycle, when instance state should be saved/restored // //////////////////////////////////////////////////////////////////////////// @Override public void onSaveInstanceState(Bundle toSave) {⑨ super.onSaveInstanceState(toSave); Log.i(TAG, /"onSaveinstanceState/"); } }
正如在LogCat过滤器中要显示Activity组件回调的日志项时,可以为Fragment回调定制过滤器一样。
如果重复这些步骤,即启动其他的应用,直到在LogCat窗口中看到调用了Fragment生命周期方法,你会发现从其包含的View来看,Activity实例中的每个Fragment实例行为都和封闭的Activity行为类似。调用类似的生命周期过渡和状态。
了解了每个方法什么时候调用,我们先一起来看一看这些方法:
① 当Fragment实例和Activity实例关联时,会调用onAttach方法。这并不是说Activity类是完全初始化的。
② 当创建或重新创建Fragment实例时,会调用onCreate方法。如果其是在Fragment或其包含的Activity组件被删除后重新创建的,如果保存了某些状态,那么bundle参数会是非空的。
③ 当Fragment实例创建包含View的对象层次结构时,会调用onCreateView方法。Fragment在Activity中是很特殊的:它的行为类似ViewGroup,但是它不属于View类结构。可以把Fragment想成一个支持很多Activity并包含了多个View实例的集合。在这个例子中,我们加载了一个包含TextView的非常简单的布局。
④ 当创建完包含Fragment实例的Activity及包含Fragment的View对象时,会调用onActivityCreated方法。这时通过ID查找View对象是安全的。
⑤ 当Fragment变得可见时,可以调用onStart方法,该方法和Activity的onStart方法非常相似。
⑥ 当Fragment变得可见并且在运行时,会调用onResume方法。
⑦ 当Fragment要离开前端界面时,会调用onPause方法,它和Activity实例的onPause方法类似。
⑧ 当Fragment要停止运行时,会调用onStop方法。
⑨ 当需要保存实例状态时,会调用onSaveInstanceState方法,这样当销毁该实例时(实际上是删除引用),需要保存的任何特定的状态都可以保存在该调用所传递的Bundle对象中。
Fragment对象不是组件。可以把Fragment对象看作是一个把Activity对象分解成在Activity中包含的多个对象的一种方式,每个对象包含自己的View结构,它的行为和Activity的View结构的行为类似。