在编写一个底层有三个RadioButton,中间层是一个Linearlayout的app的的时候,在每个radiobutton对应的向Linearlayout中添加fragment,第二个有点特殊,不是直接的加入fragment而是加入了一个viewpager,并且在viewpager里面添加了fragment进行切换.
于是问题来了 :在切换不同界面的时候 第一次读取viewpager的时候可以显示里面的fragment并且可以自由的切换。当读取另外一个radiobutton的时候再切换回来,viewpager里面显示的成为了空白,这个问题困扰了我大半天,头也是够疼的。找了各种博客看了各种文章又看了看源码。最终搞懂了其中奥秘。
就在这里给大家小小的解释一下。
首先,我们所写的Viewpager的adatper 有可能继承自三个类 一个是PagerAdapter,另一个是FragmentPagerAdapter,最后一个是FragmentStatePagerAdapter。
后两个都是PagerAdapter的子类,当然相比父类,我们优化了很多新的功能并且简化了很多代码。
说了这么多,主要原因还是因为对Frgament的生命周期不是很理解。
转转好的文章http://blog.csdn.net/forever_crying/article/details/8238863/
在每次加载viewpager的时候都会调用viewpager里面的OncreatView方法 所以会造成原有的已经加载好的view被新的页面所覆盖,导致在第二次打开viewpager的时候会显示空白。说说主要原因,是因为我们所自定义写的Adapter继承自FragmentPagerAdapter,而FragmentPagerAdapter该类内的每一个生成的 Fragment 都将保存在内存之中,因此适用于那些相对静态的页,数量也比较少的那种;而我们动态加载这些fragment的时候消耗的内存更多,所以导致我们在加载fragment的时候遇到了白屏。所以选择继承自FragmentStatePagerAdapter才能解决问题,和 FragmentPagerAdapter 不一样的是,正如其类名中的 'State' 所表明的含义一样,该 PagerAdapter 的实现将只保留当前页面,当页面离开视线后,就会被消除,释放其资源;而在页面需要显示时,生成新的页面(就像 ListView 的实现一样)。这么实现的好处就是当拥有大量的页面时,不必在内存中占用大量的内存。