FragmentActivity
只有FragmentActivity才能内嵌fragment页面,普通Activity是不行的。
FragmentActivity的getSupportFragmentManager()返回FragmentManager对象。
FragmentPagerAdapter
FragmentPagerAdapter的构造函数中不知道为什么,要调用超类的构造函数
超类的构造函数中要传入FragmentManager
FragmentPagerAdapter中的getItem()返回的是Fragment类型
Fragment
Fragment有两个重要方法,一个是onCreateView(),一个是onViewCreated()方法
onCreateView()主要是加载页卡布局文件,返回相应的view
onViewCreated()主要是对onCreateView()返回的view的修饰,填充。如果onCreateView()返回的view
只是一个空view,没有内容填充,比如listview没有设置适配器绑定数据。就会在这个方法中填充数据。
关系
FragmentManager管理Fragment,言外之意就是切换Fragment靠的是FragmentManager。
FragmentPagerAdapter利用FragmentManager以间接的方式切换Fragment,所以在FragmentPagerAdapter的
构造函数中,必须传入FragmentManager对象作为参数。
切换Fragment时所调用的方法
下面我们在替换Fragment时顺便addToBackStack,则其生命周期展现方式是:
1 replace FragA and addToBackStack 2 ######################################################################################## 3 01-13 17:08:43.359 3102-3102/com.yeepay.fraglifecircletest I/FragA﹕ onAttach 4 01-13 17:08:43.359 3102-3102/com.yeepay.fraglifecircletest I/FragA﹕ onCreate 5 01-13 17:08:43.359 3102-3102/com.yeepay.fraglifecircletest I/FragA﹕ onCreateView 6 01-13 17:08:43.359 3102-3102/com.yeepay.fraglifecircletest I/FragA﹕ onViewCreated 7 01-13 17:08:43.359 3102-3102/com.yeepay.fraglifecircletest I/FragA﹕ onActivityCreated 8 01-13 17:08:43.359 3102-3102/com.yeepay.fraglifecircletest I/FragA﹕ onStart 9 01-13 17:08:43.359 3102-3102/com.yeepay.fraglifecircletest I/FragA﹕ onResume
这是创建FragA所调用的生命周期方法
然后通过点击按钮B,使用FragB来替换FragA,此时FragA和FragB的生命周期方法调用顺序是:
1 and then replace FragB and addToBackStack 2 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 3 01-13 17:08:46.959 3102-3102/com.yeepay.fraglifecircletest I/FragA﹕ onPause 4 01-13 17:08:46.959 3102-3102/com.yeepay.fraglifecircletest I/FragA﹕ onStop 5 01-13 17:08:46.959 3102-3102/com.yeepay.fraglifecircletest I/FragA﹕ onDestroyView 6 01-13 17:08:46.959 3102-3102/com.yeepay.fraglifecircletest I/FragB﹕ onAttach 7 01-13 17:08:46.959 3102-3102/com.yeepay.fraglifecircletest I/FragB﹕ onCreate 8 01-13 17:08:46.959 3102-3102/com.yeepay.fraglifecircletest I/FragB﹕ onCreateView 9 01-13 17:08:46.959 3102-3102/com.yeepay.fraglifecircletest I/FragB﹕ onViewCreated 10 01-13 17:08:46.959 3102-3102/com.yeepay.fraglifecircletest I/FragB﹕ onActivityCreated 11 01-13 17:08:46.959 3102-3102/com.yeepay.fraglifecircletest I/FragB﹕ onStart 12 01-13 17:08:46.959 3102-3102/com.yeepay.fraglifecircletest I/FragB﹕ onResume
由此可以看出,FragA生命周期方法只是调用到了onDestroyView,而onDestroy和onDetach则没有被调用,这说明FragA的界面已经被销毁了,但是FragmentManager并没有完全销毁FragA,FragA依然有状态保存在FragmentManager里面。
然后再点击按钮A,使用FragA来替换当前显示的FragB,此时FragA和FragB的生命周期方法调用顺序为:
1 and then replace FragA again 2 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 3 01-13 17:08:51.869 3102-3102/com.yeepay.fraglifecircletest I/FragB﹕ onPause 4 01-13 17:08:51.869 3102-3102/com.yeepay.fraglifecircletest I/FragB﹕ onStop 5 01-13 17:08:51.869 3102-3102/com.yeepay.fraglifecircletest I/FragB﹕ onDestroyView 6 01-13 17:08:51.869 3102-3102/com.yeepay.fraglifecircletest I/FragA﹕ onCreateView 7 01-13 17:08:51.869 3102-3102/com.yeepay.fraglifecircletest I/FragA﹕ onViewCreated 8 01-13 17:08:51.869 3102-3102/com.yeepay.fraglifecircletest I/FragA﹕ onActivityCreated 9 01-13 17:08:51.869 3102-3102/com.yeepay.fraglifecircletest I/FragA﹕ onStart 10 01-13 17:08:51.869 3102-3102/com.yeepay.fraglifecircletest I/FragA﹕ onResumeView Code
可以看到此时FragA直接从onViewCreated()调起,也就是说只是重新创建了视图,而依然使用上次被替换时的Fragment状态。
查阅资料地址:http://www.tuicool.com/articles/mIvyAzn
Fragment的缓存
在fragmentpageadapter的instantiateItem方法里,他会先去FragmentManager里面去查找有没有相关的fragment如果有就直接使用如果没有才会触发fragmentpageadapter的getItem方法获取一个fragment。
查阅资料地址:http://blog.csdn.net/devilkin64/article/details/39379143
http://blog.csdn.net/z13759561330/article/details/40737381