1

我有一个应用程序,它有一个Activity可以换出许多Fragment's 的 main。好吧,不管Fragment你在做什么,在内存不足Activity并尝试返回应用程序后,它会引导你回到第一个调用的“开始FragmentActivity。(注:几乎所有这些实际上都是ListFragment's)

所以这是我的问题:

我应该onSaveInstanceState()在每个片段中使用吗?如果是这样,我是将数据保存在 Fragment 还是 Fragment本身?或者你onSaveInstanceState()只在 Main 中使用过一次Activity。(如果这甚至是要采取的课程)

注意:我有 setRetainInstance(true),但如果这是解决方案,我认为我没有正确处理。这些都放在最后一行onActivityCreated()

4

1 回答 1

1

答案很大程度上取决于您如何管理片段。

我假设您没有使用 Fragment backstack,并且您在每个片段上调用了 setRetainInstance(true)。

附加片段时需要使用标签。

在 Activity#onSaveInstanceState() 中,您需要记住哪些片段是可见的。

在 Activity#onCreate 中,您需要为每个片段按标签查找现有片段,然后为您找不到的任何片段创建新实例。现在,您可以使用保存的实例状态中的信息来使相应的片段可见(根据您的代码管理片段的方式,根据需要显示、添加或替换。)

针对问题/评论进行编辑:

  • activty.getFragmentManager().findFragmentByTag(tag); 找到一个现有的片段
  • 在 Fragment 事务中:add(fragment, tag), replace(id, fragment, tag) 等让您指定标签。您也可以使用属性将其放入布局文件中
    • 类=".myFrag$标签"

当您使用 setRetainInstance 时,包含其内容的实际片段对象仍然存在。

注意:如果不想使用标签,也可以使用片段管理器的 putFragment/getFragment 方法将片段放入实例状态包中。

最后,您可以简单地通过调用 FragmentManager 的 saveFragmentInstanceState 让片段自行保存,但我在正确使用它时遇到了麻烦。

于 2013-09-10T17:02:44.503 回答