首页 » Android程序设计:第2版 » Android程序设计:第2版全文在线阅读

《Android程序设计:第2版》Fragment生命周期可视化

关灯直达底部

如果你是在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结构的行为类似。