【发布时间】:2023-03-13 03:40:01
【问题描述】:
我一直在努力找出FragmentActivity 和ViewPager 中的片段的正确管理是什么。在我详细介绍之前,我所面临的问题的简要总结如下:
我有一个FragmentActivity 和一个ViewPager。 ViewPager 使用自定义但非常简单的FragmentPagerAdapter。 ViewPager 中的每个Fragment 都包含一个ExpandableListView。我还有一个名为“刷新”的操作栏按钮。现在,我们假设ViewPager 只有一个Fragment。活动已创建,Fragment 的 ExpandableListView 已填充(到目前为止一切正常)。单击 Refresh 按钮时,FragmentActivity 中的处理方法将遍历分配给 FragmentPagerAdapter 的 Fragments 列表,并在每个 Fragment 上调用 refresh() 以填充其 ListView。但是,当设备的方向发生变化时(例如从纵向变为横向),Activity 会重新创建,片段也会重新创建。现在单击刷新按钮将遍历未初始化的Fragments。
我知道我说的很模糊,尤其是没有示例代码,但请多多包涵。我从应用程序/活动的开始跟踪问题和方法调用如下:
FragmentActivity.onCreate()FragmentActivity.setContentView()-
FragmentActivity.createPagerFragments() Fragment.onAttach()-
Fragment.onCreate() -
Fragment.onCreateView() -
Fragment.onActivityCreated() - >
FragmentActivity.onCreate()Fragment.onAttach()Fragment.onCreate()FragmentActivity.setContentView()FragmentActivity.createPagerFragments()Fragment.onCreateView()Fragment.onActivityCreated()- >
-
FragmentActivity.refresh() - >
所以,在我看来,问题如下:
当 Android 在屏幕方向改变后重新创建 FragmentActivity 及其 Views 时(上面调用 #9-15),它会创建新的 Fragment 对象,并将其状态恢复到原始状态。然而,这些似乎完全由FragmentManager 管理,而不是由FragmentPagerAdapter。相反,当FragmentPagerAdapter 与活动的onCreate 方法中的Fragments 一起重新创建时(参见调用#13),分配给适配器的Fragments 永远不会有它们的Fragment.onCreate() 或@987654364 @ 方法完全调用。因此,当调用 refresh() 方法时(参见 #17),该方法将遍历这些尚未初始化的 Fragments。因此,当他们尝试填充ExpandableListView 时,视图的实例变量是NULL。这是意料之中的,因为实例变量仅在 Fragment.onCreateView() 方法中分配,而不会在这些 Fragments 上调用。
所以我的问题是:如何在屏幕方向改变后正确地重新使用重新创建的(由 Android)Fragments 以避免创建新的不没有初始化?我需要对它们有一个有效的引用,以便调用它们的 refresh() 方法来按需填充它们。理想情况下,它们也应该分配给FragmentPagerAdapter。
我希望我已经清楚地描述了这个问题,而我没有提供示例代码的原因是因为问题(可以看出)不是来自代码本身,而是来自一个相当不正确(看似)的重新 -创建片段而不是重复使用。但是如果需要,我可以给你示例代码,我只是通过这种方式会更清楚。
谢谢!
【问题讨论】:
-
嗨!我有同样的问题,你是怎么解决的,因为下面的答案不是很有用)
标签: android android-fragments android-viewpager android-fragmentactivity