使用ViewPager+Fragment中Fragment状态的保存和恢复

前言部分

本片文章主要是记录一下这几天使用ViewPager+Fragment的过程。过程中查询了很多资料,也了解了很多知识,这里做个记录吧。

下面是参考学习的文章,写的很全面。

Android Fragment+ViewPager 组合,一些你不可不知的注意事项

[译]Android Activity 和 Fragment 状态保存与恢复的最佳实践

整理过的fragment状态恢复和保存,部分内容来自上面的文章

Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复

待解决的问题,读完后我还是有疑问,如下:

主要产生疑惑的地方是,关于使用FragmentStatePagerAdapter加载Fragment,当fragment从页面移除的时候,fragment的生命周期怎么走?以及fragment页面状态的变化?

先上图:

内容部分

我们其实都是用过这种方式来构建项目。

  1. 比去最常见的app首页,一般都是Activity+ViewPager+Fragment。

  2. 在比如常见的新闻类软件,也都是这样构建,不过是Fragment数量比较多。

一般我们会根据fragment的多少来选择不同的adapter,达到和合适的使用。

第一个是

FragmentPagerAdapter 一般fragment数量少的时候会选择这个adapter来使用,
因为这个adapter在滑动的过程中不会销毁fragment实例,他仅仅是去销毁视图,
fragment的实例存储到内存中,这样在滑动回来的时候,就能快速的从内存中取出fragment。

第二个是

FragmentStatePagerAdapter 一般是fragment数量比较多,
这个时候如果在把所有的fragment实例存储到内存中,就有一些不合理了。
所以使用这个adapt的时候,当fragment从页面中隐藏后,视图销毁,实例也会销毁。
这样实际是释放了内存,这本身是合理的,因为这个是adapt的特性,
但是有的时候我们想缓存页面(懒加载),但是因为fragment销毁了,所以页面会重建,
所以我们要做的工作是通过fragment的本身的特性来保存和恢复状态。
要示实现懒加载的效果

这里一共是两种方案:

  1. 是通过设置ViewPager与加载页面setOffscreenPageLimit(int i)实现,这种方案会导致fragment的实例在内存中存储,比较适合页面少的场景。
  2. 通过fragment的生命周期来完成懒加载的效果,通过setUserVisibleHint()方法来判断页面是否在前台,在通过页面是否加载过数据的标识来判断是否需要刷新数据,通过成员变量来做标记。这里实现这个原因是因为成员变量会跟随fragment的状态保存和恢复
要保存fragment的状态(和懒加载有些类似)
  1. 和上面的方案一致。

  2. 主要是这个方案有疑问,网上的资料通过重写instantiateItem()和destroyItem()来实现,但是我本地的demo并没有重写dapte中的两个方法,也实现的页面的恢复。

    这里是我疑惑的地方,我查看资料发现,事实上fragment是有自己保存状态的能力的,然后在重新加载fragment的时候状态是可以恢复的,主要通过onSaveInstanceState()和onActivityCreated()来实现,这里需要注意的是这个是fragment的状态保存和恢复,当时fragment中的view也需要保存和恢复,android中默认的view基本都是实现了onSaveInstanceState()和onRestoreInstanceState()方法。这个view还需要设置android:freezeText=true来启动这个功能,但不要忘记给每个view添加一个id

抛出问题

上文说fragment的状态是会保存和恢复的,分为两个部分,

  1. 一种是fragment实例存在,这时候只是销毁了页面,这样的话fragment中成员变量会被缓存和恢复的。然后通过view自身的状态保存和恢复来完成页面的恢复。
  2. 一种是fragment的实例销毁了(FragmentStatePagerAdapter减少了fragment在内存中的开销),这时候fragment中的成员变量就需要自己来进行保存和恢复了,但是页面的恢复还是通过fragment调用view自身的状态保存和恢复来完成。

之所以我们使用FragmentStatePagerAdapter也会顺利恢复,我觉得可能是如下原因

可以很容易看出只有FragmentStatePagerAdapter对Fragment的状态进行了保存,而FragmentPagerAdapter则是空实现。

就是说明虽然fragment的实例销毁,但是状态是被保留了,所以fragment在显示的时候,是会状态恢复的。

FragmentStatePagerAdapter源码分析

结束

通过看了很多的文章,我得出上面的结论可是不知道是不是正确,希望能有人帮我解惑,谢谢?

你可能感兴趣的:(问题分析)