0

我遵循了 FragmentTabsPager 的 ABS 示例,但我遇到了这个问题:

但是,在完成 B 之后,碎片不再附加到 A 上。经过一番调试,我发现 A 的 onCreate() 方法在完成 B 后调用了包含此条目的 savedInstanceState:

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 个实例,显示的片段不附加到活动。

我该如何解决这个问题?我究竟做错了什么?也许如果有办法获得恢复的碎片?

提前致谢

4

1 回答 1

0

如果我理解正确,这就是我的建议:

  1. 由于Fragments F1 和 F2 位于ActivityA 中,因此ActivityB不应创建或尝试与其中任何一个交互Fragment
  2. ActivityA 使用 开始ActivityB startActivityForResult,并让 B 将项目(要添加到FragmentF1)传回给 A。
  3. ActivityFragmentA 应该使用interface(就像您所做的那样)处理将新项目发送到F1。
  4. 从 A接收到新项目(在您的interface方法中)后ActivityFragmentF1 应更新其数据并刷新其Views。

另一件需要注意的事情,确保你的ActivityA 只添加你Fragment的 s 一次onCreate,它可以使用ssavedInstanceState来知道它是否正在被重新创建,或者它是否是它的第一次创建。请参阅http://developer.android.com/training/basics/fragments/fragment-ui.html

编辑

啊,现在我看到了更多你在问什么。您可以通过多种方式前往此处。

  1. 使用FragmentManagerand 标记技巧将Fragments 从 中取出ViewPager,并根据需要更新它们。
    • 这稍微危险一些,因为它会返回Fragment可能不在的 sonResume并且需要在与之交互之前进行检查。
  2. 将模型与控制器分离,例如将数据放入静态单例、SQLite DB 甚至首选项中。这将允许应用程序的其他部分访问和编辑数据,而无需传递它。
    • onResume中,您Fragment的 s 将需要检查和更新他们的数据,以防数据被更改。
    • 如果更改发生时s 已经存在,您还需要通过一种方法Activity给他们一个刷新信号。interfaceFragmentonResume
    • 或者,Loader在您Fragment的 s 中使用 a 来监控数据集并让它Fragment通过interface回调自动更新 的 UI。
于 2013-03-14T17:28:48.840 回答