我正在设计一个应用程序,允许用户在ViewPager中翻转多个页面。我一直在努力尝试弄清楚如何在屏幕上不再可见时从页面中删除Fragment实例、将其缓存(例如到HashMap)并恢复它,以便当用户翻回该页面时,视图和其他所有内容都将处于与删除之前相同的状态。例如,我的第一页是一个登录屏幕,在成功登录时会使该特定页面上的某些布局元素可见/不可见。当我向前翻了足够多的页面,然后翻回第一页时,布局会重置。这对我的另一个页面来说更成为问题,该页面包含一个巨大的横向/纵向滚动数据网格,我在后台使用线程进行绘制。我使用进度对话框通知用户加载进度,但每次加载时都很麻烦。
所以我做了一些研究......
我浏览了FragmentStatePageAdapter的源代码,在destroyItem()回调中,被删除的Fragment实例的状态被保存到一个ArrayList中。当在instantiateItem()回调中创建新的Fragment实例时,如果项目的实例不存在(他们通过使用ArrayList进行跟踪),则创建一个新的Fragment实例,并使用相应的Fragment.SavedState数据初始化其保存的状态。不幸的是,这些数据不包括视图所在的状态,尽管我注意到对于具有GridView/ListView的页面,视图的状态会以某种方式被恢复(如果我滚动到某个随机位置,翻了几页然后回来,它不会被重置)。
根据API的说法:
“保存的状态不能包含对其他片段的依赖关系——也就是说,它不能使用putFragment(Bundle, String, Fragment)来存储片段引用,因为当稍后使用此保存的状态时,该引用可能无效。同样,片段的目标和结果代码也不包括在此状态中。”
作为Android的新手,我不太确定我是否理解了最后一句话。
也就是说,有没有办法缓存View状态?如果没有,我想我将继续保留所有fragment页面在内存中。
所以我做了一些研究......
我浏览了FragmentStatePageAdapter的源代码,在destroyItem()回调中,被删除的Fragment实例的状态被保存到一个ArrayList中。当在instantiateItem()回调中创建新的Fragment实例时,如果项目的实例不存在(他们通过使用ArrayList进行跟踪),则创建一个新的Fragment实例,并使用相应的Fragment.SavedState数据初始化其保存的状态。不幸的是,这些数据不包括视图所在的状态,尽管我注意到对于具有GridView/ListView的页面,视图的状态会以某种方式被恢复(如果我滚动到某个随机位置,翻了几页然后回来,它不会被重置)。
根据API的说法:
“保存的状态不能包含对其他片段的依赖关系——也就是说,它不能使用putFragment(Bundle, String, Fragment)来存储片段引用,因为当稍后使用此保存的状态时,该引用可能无效。同样,片段的目标和结果代码也不包括在此状态中。”
作为Android的新手,我不太确定我是否理解了最后一句话。
也就是说,有没有办法缓存View状态?如果没有,我想我将继续保留所有fragment页面在内存中。