我正在设计一个应用程序,允许用户在ViewPager中的多个页面之间切换。我一直在努力研究如何从页面中删除一个Fragment实例,当它不再在屏幕上可见时将其缓存(对HashMap),然后将其恢复,以便当用户翻转回该页面,其中的视图和其他所有内容将处于删除前的相同状态。例如,我的第一个页面是一个登录屏幕,可以使某个特定页面上的某些布局元素在成功登录时可见/不可见。当我翻转足够的页面然后翻回第一页时,布局被重置。对于另一个包含巨大的水平/垂直滚动数据网格的页面来说,这变成了一个问题,我使用背景中的线程在初始化时进行绘制。我使用一个进度对话框来通知用户加载进度,每次我必须加载时它变得非常烦人。Android:Viewpager和FragmentStatePageAdapter
所以我做了一些研究...
我通过了FragmentStatePageAdapter的源代码,并在destroyItem()回调浏览,片段实例被删除的状态保存到一个ArrayList。当在instantiateItem()回调中创建Fragment的新实例时,如果某个项目的实例尚不存在(它们通过使用ArrayList跟踪此事件),则会创建一个新的Fragment实例并创建其保存的状态使用相应的Fragment.SavedState数据进行初始化。不幸的是,这些数据并不包含视图所在的状态,尽管我注意到对于具有GridView/ListView的页面,视图的状态以某种方式恢复(如果我滚动到某个随机位置,翻转几页并返回,它不会被重置)。
根据API:
保存的状态不能包含在其它片段的依赖性 - 即它不能使用putFragment(捆绑,字符串,片段),用于存储一个 片段引用,因为当以后使用此保存的状态时,该引用可能无效。同样,片段的目标和结果 代码不包含在此状态中。
作为Android的noob,我不太确定我理解最后的声明。
这就是说,有什么办法来缓存视图状态?如果没有,我想我会继续前进,并将所有的片段页面留在内存中。
你需要从FragmentStatePagerAdapter继承,如果你只使用FragmentPagerAdapter然后将的onSaveInstanceState不会被调用。 – Scott