Fragment生命周期主要体现在以下表中13个方法里,以下是按照Fragment从开始到销毁的先后执行顺序排序。
序号 | 方法名称 | 描述 |
1 | public void onInflate(Activity activity, AttributeSet attrs,BundlesavedInstanceState) | 在Activity.onCreate方法之前调用,可以获取除了View之外的资源 |
2 | public void onAttach(Activity activity) | 当fragment第一次与Activity产生关联时就会调用,以后不再调用 |
3 | public void onCreate(Bundle savedInstanceState) | 在onAttach执行完后会立刻调用此方法,通常被用于读取保存的状态值,获取或者初始化一些数据,但是该方法不执行,窗口是不会显示的,因此如果获取的数据需要访问网络,最好新开线程。 |
4 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) | 作用:创建Fragment中显示的view,其中inflater用来装载布局文件,container表示<fragment>标签的父标签对应的ViewGroup对象,savedInstanceState可以获取Fragment保存的状态 |
5 | public void onViewCreated(View view, Bundle savedInstanceState) | 继上面后就会调用此方法 |
6 | public void onActivityCreated(Bundle savedInstanceState) | 在Activity.onCreate方法调用后会立刻调用此方法,表示窗口已经初始化完毕,此时可以调用控件了 |
7 | public void onStart() | 开始执行与控件相关的逻辑代码,如按键点击 |
8 | public void onResume() | 这是Fragment从创建到显示的最后一个回调的方法 |
9 | public void onPause() | 当发生界面跳转时,临时暂停,暂停时间是500ms,0.5s后直接进入下面的onStop方法 |
10 | public void onStop() | 当该方法返回时,Fragment将从屏幕上消失 |
11 | public void onDestroyView() | 当fragment状态被保存,或者从回退栈弹出,该方法被调用 |
12 | public void onDestroy() | 当Fragment不再被使用时,如按返回键,就会调用此方法 |
13 | public void onDetach() | Fragment生命周期的最后一个方法,执行完后将不再与Activity关联,将释放所有fragment对象和资源 |
下面进行一个demo来观察fragment生命周期,
(1)从启动到显示整个界面:
点击跳转到第二个Actvity时的情况——
可以看到,依次调用onPause() 和 onStop()方法;观察其时间,可以发现就是相差500ms ;
当再次返回到这两个fragment时
当点击返回键,直接回到主界面时,可以看到fragment销毁并退出了
至此,Fragment的生命周期一览无余。
代码如下:
public class MyFragment1 extends Fragment
{
private Button button1;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
Log.d("Fragment1", "onCreateView");
View view = inflater.inflate(R.layout.my_fragment1, null);
Log.d("Fragment1_onCreateView_getActivity_edittext1",
String.valueOf(getActivity().findViewById(R.id.edittext1)));
Log.d("Fragment1_onCreateView_view_edittext1",
String.valueOf(view.findViewById(R.id.edittext1)));
button1 = (Button)view.findViewById(R.id.button1);
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(getActivity(), MainActivity.class);
startActivity(intent);
}
});
return view;
}
@Override
public void onInflate(Activity activity, AttributeSet attrs,
Bundle savedInstanceState)
{
Log.d("Fragment1", "onInflate");
Log.d("Fragment1_onInflate_activity_stringResource", activity
.getResources().getString(R.string.app_name));
Log.d("Fragment1_onInflate_class",
attrs.getAttributeValue(null, "class"));
Log.d("Fragment1_onInflate_getActivity", String.valueOf(getActivity()));
Log.d("Fragment1_onInflate_activity_edittext1",
String.valueOf(activity.findViewById(R.id.edittext1)));
Log.d("Fragment1_onInflate_savedInstanceState",
String.valueOf(savedInstanceState));
super.onInflate(activity, attrs, savedInstanceState);
}
@Override
public void onAttach(Activity activity)
{
Log.d("Fragment1", "onAttach");
Log.d("Fragment1_onAttach_activity_edittext1",
String.valueOf(activity.findViewById(R.id.edittext1)));
Log.d("Fragment1_onAttach_getActivity_edittext1",
String.valueOf(getActivity().findViewById(R.id.edittext1)));
super.onAttach(activity);
}
@Override
public void onCreate(Bundle savedInstanceState)
{
Log.d("Fragment1", "onCreate");
Log.d("Fragment1_onCreate_getActivity", String.valueOf(getActivity()));
super.onCreate(savedInstanceState);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState)
{
Log.d("Fragment1", "onViewCreated");
Log.d("Fragment1_onViewCreated_getActivity_edittext1",
String.valueOf(getActivity().findViewById(R.id.edittext1)));
Log.d("Fragment1_onViewCreated_view_edittext1",
String.valueOf(view.findViewById(R.id.edittext1)));
super.onViewCreated(view, savedInstanceState);
}
@Override
public void onActivityCreated(Bundle savedInstanceState)
{
Log.d("Fragment1", "onActivityCreated");
Log.d("Fragment1_onActivityCreated_getActivity_edittext1",
String.valueOf(getActivity().findViewById(R.id.edittext1)));
super.onActivityCreated(savedInstanceState);
}
@Override
public void onStart()
{
Log.d("Fragment1", "onStart");
super.onStart();
}
@Override
public void onResume()
{
Log.d("Fragment1", "onResume");
super.onResume();
}
@Override
public void onPause()
{
Log.d("Fragment1", System.currentTimeMillis()+"onPause");
super.onPause();
}
@Override
public void onStop()
{
Log.d("Fragment1", System.currentTimeMillis()+"onStop");
super.onStop();
}
@Override
public void onDestroyView()
{
Log.d("Fragment1", "onDestroyView");
super.onDestroyView();
}
@Override
public void onDestroy()
{
Log.d("Fragment1", System.currentTimeMillis()+"onDestroy");
super.onDestroy();
}
@Override
public void onDetach()
{
Log.d("Fragment1", "onDetach");
super.onDetach();
}
}
使用Fragmen的好处就是可以把业务逻辑和UI封装在一起,与外部关联系不大,其他程序也可以用该组件,从而实现复用最大化。