我不太了解这个片段生命周期业务。
我的应用程序的“查看详细信息”部分有一个非常标准的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一次。
这里感觉不舒服。
现在我想我应该让父片段活动声明并调用所有异步任务来获取我需要在片段中显示的数据。 在父片段活动拥有的对象中设置异步调用的结果,然后让片段使用父片段包含的对象来创建列表视图等。
但是,如果父活动启动的异步任务在调用每个片段onCreateView之前没有完成,并且父级包含的对象尚未就绪,那该怎么办呢?
签名,困惑和沮丧答案 0 :(得分:26)
ViewPager非常热衷于关闭目前没有使用的东西,这正是这里发生的事情。默认行为是ViewPager在要查看的页面的任一侧“保持”一页,并销毁其余页面。因此,在您的3页视图中,第3页在选择第1页时会被破坏,然后在重新选择第2页时会重新创建第3页。正如您所注意到的那样,第2页只有onCreate(..)
被调用一次,因为它始终与当前选定的页面相邻,或者是当前所选页面。
要解决此问题,只需设置ViewPager.setOffscreenPageLimit(2)
即可。然后ViewPager将保留所有碎片。显然这对于大量碎片来说不是一个好主意,但对于你的情况来说它应该没问题。
答案 1 :(得分:2)
@ Espiandev的解决方案适用于您当前的案例,但您的状态是正确的。您应该使用setArgument
和/或onSaveInstanceState
方法来保存Fragment
的状态(这不应该太难,因为例如,通常可以表示来自服务器的响应作为字符串),然后使用getArgument
和/或Bundle
中传递的onCreate
来恢复它。
或者,您可以让Activity
执行服务器提取,然后为每个片段调用setArgument
,并检查Fragment
中的参数以确定您的数据是否包含到了(如果没有,可能会显示某种加载状态)。
如果您完全关心屏幕方向更改,this related question对您也很有用。