vmi*_*nov 14 android android-fragments android-viewpager android-fragmentactivity
我一直在努力找出哪些片段内的正确管理FragmentActivity
用ViewPager
的.在我详细介绍之前,我面临的问题的快速摘要如下:
我有FragmentActivity
一个ViewPager
.在ViewPager
使用自定义的,但非常简单FragmentPagerAdapter
.每个Fragment
所述内ViewPager
的包括ExpandableListView
.我还有一个名为"刷新"的操作栏按钮.现在,我们假设ViewPager
只有一个Fragment
.创建活动,并填充Fragment
's' ExpandableListView
(迄今为止很好).单击"刷新"按钮时,FragmentActivity
迭代在其列表中的处理方法Fragments
将分配给FragmentPagerAdapter,并refresh()
在每个Fragment
上调用以填充其ListView.但是,当设备的方向发生变化时(例如,从纵向到横向),将重新创建活动,片段也是如此.现在单击"刷新"按钮将迭代未初始化Fragments
.
我知道我很模糊,特别是没有示例代码,但请耐心等待.我从应用程序/活动的开头跟踪了问题和方法调用:
FragmentActivity.onCreate()
FragmentActivity.setContentView()
FragmentActivity.createPagerFragments()
< - 这将创建一个Fragments的ArrayList,并将它们分配给一个新的FragmentPagerAdapter,而FragmentPagerAdapter又分配给ViewPager.Fragment.onAttach()
Fragment.onCreate()
< - 这里没什么特别的,只是调用super方法.Fragment.onCreateView()
< - 这里没什么特别的,只是给布局充气Fragment.onActivityCreated()
< - 这里也没什么.FragmentActivity.onCreate()
Fragment.onAttach()
Fragment.onCreate()
FragmentActivity.setContentView()
FragmentActivity.createPagerFragments()
Fragment.onCreateView()
Fragment.onActivityCreated()
FragmentActivity.refresh()
< - 迭代来自#13的新创建的碎片(不是Android的这些!).所以问题,正如我所看到的,如下所示:当Android 在屏幕方向改变后重新创建FragmentActivity
它时Views
(上面调用#9-15),它会创建新Fragment
对象,其状态恢复到原始对象的状态.然而,这些似乎完全由FragmentManager
,而不是由管理FragmentPagerAdapter
.相反,当FragmentPagerAdapter
与Fragments
activity的onCreate
方法一起重新创建(参见调用#13)时Fragments
,分配给适配器的内容永远不会调用它们Fragment.onCreate()
或Fragment.onCreateView()
方法.因此,当调用refresh()方法时(参见#17),该方法将迭代Fragments
那些尚未初始化的方法.因此,当他们尝试填充时ExpandableListView
,视图的实例变量是NULL
.这是预期的,因为实例变量仅在Fragment.onCreateView()
永远不会被调用的方法中分配Fragments
.
所以我的问题是:Fragments
在屏幕方向改变之后,如何正确地重新使用重新创建的(通过Android)以避免创建未初始化的新的?我需要有一个有效的引用,以便调用他们的按需填充它们的refresh()方法.理想情况下,它们也应该被分配给它们FragmentPagerAdapter
.
我希望我已经清楚地描述了这个问题,而且我没有提供示例代码的原因是因为问题(可以看出)不是来自代码本身,而是来自一个相当不正确(似乎)重新创建的Fragments而不是重复使用.但如果需要,我可以给你样例代码,我只是通过这种方式会更清楚.
谢谢!
阅读很多,但在阅读了介绍和问题以及使用FragmentStatePagerAdapter(类似于FragmentPagerAdapter)后,我可以告诉你:
旋转后,您的适配器将自动附加旧片段.因此,虽然正在重新创建活动创建适配器,但FragmentManager是全局的并且它的实例保留活动的重新创建将检测到新的FragmentStatePagerAdapter与相同的ViewPager组合并且要求相同的片段并且将简单地从Fragment的BackStack中获取它们.
您作为Fragments的设计者可以通过继续调用Fragment.onAttach()和Fragment.onDetach()来注意到这种行为.当onAttach()出现时,它要么创建片段,要么在旋转后重新使用它.您应该能够通过使用回调onRestoreRnstanceState()来区分Fragment已被轮换.
你会在你的日志中看到许多onCreate()和其他状态同时记录,因为FragmentStatePagerAdapter总是提取/创建min 3 Fragments(除非你设置它们只有2或1),所以屏幕旋转之后也会重新连接3个片段堆栈中.
我希望它有所帮助.
归档时间: |
|
查看次数: |
11346 次 |
最近记录: |