代码之家  ›  专栏  ›  技术社区  ›  TheLettuceMaster

使用onSavedInstanceState保存ListData对象

  •  1
  • TheLettuceMaster  · 技术社区  · 12 年前

    我有一个应用程序,它有一个主 Activity 换掉了很多 Fragment 的。不管怎样 碎片 在内存不足导致 活动 当你试图返回应用程序时,它会引导你回到“开始” 碎片 活动 第一次呼叫。(注意:实际上几乎所有这些都是 ListFragment 的)

    以下是我的问题:

    我应该使用吗 onSaveInstanceState() 在每个片段中?如果是的话,我是不是在拯救 数据 在片段或片段中 它本身 ? 或者你用 onSaveInstanceState()上 只有一次 活动 。(如果这是一门课程的话)

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

    1 回复  |  直到 12 年前
        1
  •  1
  •   Dale Wilson    12 年前

    答案在很大程度上取决于你是如何管理碎片的。

    我假设您没有使用Fragment backback,并且您已经对每个片段调用了setRetainInstance(true)。

    当你附加碎片时,你需要使用一个标签。

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

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

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

    • activty.getFragmentManager().findFragmentByTag(标记);查找现有片段
    • 在Fragment事务中:add(Fragment,tag)、replace(id、Fragment、tag)等可以指定标记。您也可以使用属性将其放在布局文件中
      • class=“.myFrag$tag”

    使用setRetainInstance时,实际的片段对象(包括其内容)仍然存在。

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

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