gpt4 book ai didi

安卓:Viewpager 和 FragmentStatePageAdapter

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:35:16 24 4
gpt4 key购买 nike

我正在设计一个允许用户在 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 页面留在内存中。

最佳答案

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

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

在我想保存的 fragment 上。在第一个函数中,你应该在 Bundle 中保存你需要恢复 View 的日期(在我的例子中我有一堆微调器所以我使用一个 int 数组来保存他们的位置)。恢复 fragment 时调用的第二个函数是您实现恢复过程的地方。

希望对您有所帮助。我还使我的适配器继承自 FragmentStatePageAdapter,但我不确定这是强制性的。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com