FragmentActivity、Fragment、FragmentPagerAdapter与FragmentManager

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﹕ onResume
View Code

可以看到此时FragA直接从onViewCreated()调起,也就是说只是重新创建了视图,而依然使用上次被替换时的Fragment状态。

查阅资料地址:http://www.tuicool.com/articles/mIvyAzn



Fragment的缓存

     Fragment 都将缓存在内存之中. 也就是FragmentManager中。

      fragmentpageadapter的instantiateItem方法里,他会先去FragmentManager里面去查找有没有相关的fragment如果有就直接使用如果没有才会触发fragmentpageadapter的getItem方法获取一个fragment。

查阅资料地址:http://blog.csdn.net/devilkin64/article/details/39379143

                         http://blog.csdn.net/z13759561330/article/details/40737381



你可能感兴趣的:(FragmentActivity、Fragment、FragmentPagerAdapter与FragmentManager)