自从android4.0之后,fragment就被广泛使用,我们知道Fragment与Activity有所不同,也有相似之处。Activity有生命周期,Fragment也有生命周期,了解了Fragmnet的生命周期,我们才能在控制程序时游刃有余。
先来看看官方给出的fragment的生命周期图:
从上面可以看出Fragment有11个状态,测试代码如下:
public class RightFragment extends Fragment{
public static final String TAG = "RightFragment";
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
Log.d(TAG, "onAttach");
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.d(TAG, "onCreateView");
View view = inflater.inflate(R.layout.right_fragment, container, false);
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.d(TAG, "onActivityCreated");
}
@Override
public void onStart() {
super.onStart();
Log.d(TAG, "onStart");
}
@Override
public void onResume() {
super.onResume();
Log.d(TAG, "onResume");
}
@Override
public void onPause() {
super.onPause();
Log.d(TAG, "onPause");
}
@Override
public void onStop() {
super.onStop();
Log.d(TAG, "onStop");
}
@Override
public void onDestroyView() {
super.onDestroyView();
Log.d(TAG, "onDestroyView");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy");
}
@Override
public void onDetach() {
super.onDetach();
Log.d(TAG, "onDetach");
}
}
运行程序,控制台输出:
跳到别的fragment时:
再次启动fragment时:(注意这里你不是按回退键)
Fragment之间是独立的,那么如何实现切换时前一个Fragment就会销毁,再次启动时,重新创建。那么如何实现类似activity的回退效果呢?
看下面的代码:
Fragment1 fragment1 = new Fragment1();
FragmentManager fragmentManager1 = getFragmentManager();
FragmentTransaction transaction1 = fragmentManager1. beginTransaction();
transaction1.replace(R.id.right_layout, fragment1);
transaction1.addToBackStack(null);
transaction1.commit();
实现回退效果,就需要添加 transaction1.addToBackStack(null);这一句,那么切换Fragment时,fragment不是被销毁,而是进入回退栈,当点击回退键时,栈顶fragment被销毁,之前的fragment替代栈顶fragment,显示在界面上。
有了activity的生命周期作为基础,Fragment的生命周期就容易理解多了。接下来就可以愉快的和代码玩耍了!