【发布时间】:2013-03-14 16:00:35
【问题描述】:
我已经遵循了 FragmentTabsPager 的 ABS 示例,但是我遇到了这个问题:
- Activity A 有两个片段:F1、F2,它们使用 TabsAdapter 添加到 A 的 onCreate() 方法中。
- Activity A 可以选择刷新片段,根据 http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity
- Activity A 可以选择启动 Activity B,这会将项目添加到 F1(因此需要更新 F1)
但是,在完成 B 之后,碎片不再附加到 A 上。经过一番调试,我发现A的onCreate()方法是在B完成后调用的,保存的InstanceState包含这个条目:
android:support:fragments=android.support.v4.app.FragmentManagerState$41bfffe0
我的理解是 FragmentActivity 在启动 B 之前保存了片段,在重新启动 A 之后,它会尝试恢复它们。稍微追查发现,在完成B之后,调用了这些动作:
Activity A: constructor called
Fragment F1: constructor called
Fragment F2: constructor called
Fragment F1: onAttach
Fragment F1: onCreate
Fragment F2: onAttach
Fragment F2: onCreate
Activity A: onCreate
Activity A: TabsAdapter created
TabsAdapter: addTab android.widget.TabHost$TabSpec@41d949f8
Fragment F1: constructor called
TabsAdapter: addTab android.widget.TabHost$TabSpec@41d965d0
Fragment F2: constructor called
Fragment F1: onActivityCreated
Fragment F1: onCreateLoader
Fragment F2: onActivityCreated
Fragment F2: onCreateLoader
Activity A: onStart
Fragment F1: onResume
Fragment F1: onCreateLoader
Fragment F2: onResume
Fragment F2: onCreateLoader
Activity B: onStop
Fragment F1: onLoadFinished
Fragment F2: onLoadFinished
每个片段有2个实例,显示的片段不附加到活动。
我该如何解决这个问题?我究竟做错了什么?也许如果有办法获得恢复的碎片?
提前致谢
【问题讨论】:
-
您最终要达到的目标尚不清楚。
ActivityB 是否只是为了添加到FragmentF1 显示的数据上?还是它试图显示Fragments F1 和 F2 的相同实例?如果您提供有关当前应用架构的更多信息,以及您希望每个部分做什么,这将有助于我们给出更好的答案。 -
@Steven Activity B 只添加了一个新项目,F1 应该显示该项目。哪些架构信息会有所帮助?请指定,以便我可以给您所需的内容。
-
@Steven 我终于找到了如何获得恢复的片段:
getSupportFragmentManager().findFragmentByTag("android:switcher:VIEW_PAGER_RESOURCE_ID:TAB_ORDER"),它现在正在工作!但是,在我看来,这不是一个正确的方法。你知道如何通知 Activity 中包含的 Fragment 来更新它们的 UI 吗?
标签: android android-fragments android-tabhost android-fragmentactivity