8

我不太了解这个片段生命周期业务。

我的应用程序的“查看详细信息”部分有一个非常标准的 3 页水平滑块视图寻呼机布局。我在三个页面的中间页面上启动我的应用程序。我的 FragmentActivity 将页面设置为第 1 页。

mPager.setCurrentItem(1); //default to center page, current data view fragment

我一直在使用 FragmentStatePagerAdapter,因为使用 FragmentPagerAdapter 有时会导致我的应用程序崩溃,例如从暂停状态返回时,这是目前解决此问题的最快方法。似乎有效,但我怀疑状态方面可能是我的问题的原因,也许。

所以一开始我以为我会让每个片段完成从休息服务获取数据的工作,然后将其显示在列表中,但我不再那么确定了。

我尝试运行一个独特的异步任务来获取每个片段 onCreateView 事件中的数据。然后在阅读了有关片段生命周期的更多信息后,我切换到 onCreate,注意到 onCreateView 被大量调用,这反过来又导致了一个经常通过网络请求数据的贪婪应用程序。

切换到 onCreate 并没有改变任何东西。对于 2 个相邻片段,OnCreate 仍然像 onCreateView 一样被调用。

奇怪的是,我设置为在 Fragment Activity 中显示的第一个片段只获得了一次调用 onCreate。

感觉这里有些不对劲。

现在我在想我应该声明父片段活动并调用所有异步任务来获取我需要在片段中显示的数据。在父片段活动拥有的对象中设置异步调用的结果,然后让片段使用父片段包含的对象来创建列表视图等。

但是,如果父 Activity 启动的异步任务在调用每个片段 onCreateView 之前没有完成,并且父 Activity 包含的对象还没有准备好怎么办......

签名,困惑和沮丧

4

2 回答 2

25

ViewPager 非常热衷于关闭它当前不使用的东西,而这正是这里发生的事情。ViewPager 的默认行为是“保留”正在查看的页面两侧的一个页面,并销毁其余页面。因此,在您的3页视图中,选择第1页时,第3页被销毁,然后重新自定义第2页,请重新创建第3页。正如您所注意到的,第 2 页只onCreate(..)调用了一次,因为它总是与当前选定的页面相邻,或者说是当前选定的页面。

要解决这个问题,只需设置ViewPager.setOffscreenPageLimit(2). 然后 ViewPager 将保留您的所有片段。显然,这对于大量 Fragment 来说不是一个好主意,但对于您的情况应该没问题。

于 2012-08-07T19:24:39.480 回答
2

@Espiandev 的解决方案将适用于您当前的情况,但您的状态是问题是正确的。您应该使用setArgumentand/oronSaveInstanceState方法来保存您Fragment的状态(这不应该太难,因为例如,来自服务器的响应通常可以表示为字符串),然后使用和getArgument/或Bundle传入onCreate恢复它。

或者,您可以让您Activity的服务器获取,然后调用setArgument您的每个片段,并检查您内部的参数Fragment以确定您的数据是否已经到达(如果没有,可能会显示某种加载状态)。

如果您完全关心屏幕方向的变化,这个相关问题也将对您有用。

于 2012-08-07T20:56:17.220 回答