请选择 进入手机版 | 继续访问电脑版
  • 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Android:Viewpager 和 FragmentStatePagerAdapter

[复制链接]
菜鸟教程小白 发表于 2022-11-6 16:17:16 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在设计一个允许用户在 ViewPager 中的多个页面之间切换的应用程序。我一直在努力弄清楚如何在屏幕上不再可见时从页面中删除 Fragment 实例,将其缓存(例如,HashMap),然后将其还原,以便当用户翻回该页面,其中的 View 和其他所有内容都将处于与删除之前相同的状态。例如,我的第一个页面是一个登录屏幕,它使该特定页面上的某些布局元素在成功登录时可见/不可见。当我向前翻了足够多的页面然后翻回第一页时,布局被重置。对于我的另一个页面来说,这成为一个更大的问题,其中包含一个巨大的水平/垂直滚动数据网格,我在初始化时使用后台线程进行绘制。我使用进度对话框来通知用户加载进度,每次我必须加载它时都会变得非常烦人。

所以我做了一些研究......

我浏览了 FragmentStatePageAdapter 的源代码,在 destroyItem() 回调中,被删除的 Fragment 实例的状态被保存到一个 ArrayList 中。当在 instantiateItem() 回调中创建 Fragment 的新实例时,如果项目的实例尚不存在(它们通过使用 ArrayList 来跟踪这一点),则会创建一个新的 Fragment 实例并保存其状态使用相应的 Fragment.SavedState 数据进行初始化。不幸的是,这些数据不包括 View 所处的状态,尽管我注意到对于具有 GridView/ListView 的页面, View 的状态以某种方式恢复(如果我滚动到某个随机位置,翻了几页然后回来,它不会被重置)。

根据 API:

The saved state can not contain dependencies on other fragments -- that is it can't use putFragment(Bundle, String, Fragment) to store a fragment reference because that reference may not be valid when this saved state is later used. Likewise the Fragment's target and result code are not included in this state.

作为一个 Android 新手,我不太确定我是否理解最后一句话。

话虽如此,有没有办法缓存 View 状态?如果没有,我想我会继续将所有 fragment 页面留在内存中。



Best Answer-推荐答案


我遇到了同样的问题,通过实现这两个功能解决了

    public void onSaveInstanceState (Bundle outState)
    public void onActivityCreated (Bundle savedInstanceState)

关于我想保存的 fragment 。在第一个功能上,您应该在 Bundle 中保存恢复 View 所需的日期(在我的情况下,我有一堆微调器,所以我使用了 一个 int 数组来保存它们的位置)。第二个函数是在恢复 fragment 时调用的,用于实现恢复过程。

我希望这会有所帮助。我还让我的适配器从 FragmentStatePageAdapter 继承,但我不确定这是强制性的。

关于Android:Viewpager 和 FragmentStatePagerAdapter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6908000/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝0

帖子688407

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap