在活动之间保留片段状态

时间:2011-05-17 16:41:36

标签: android android-activity android-3.0-honeycomb android-fragments

可以在活动之间保留Fragment吗?

假设我有活动A,片段F_Left位于左侧,片段F_Right位于右侧。如果我想发布一个新的活动并保留片段F_Left ......我该怎么做?

我可以在活动之间保留片段F_Left状态吗?

请注意,我想要启动一个新的Activity,因为Fragment F_Left是我的应用菜单而Fragment F_Right完全改变了用户操作的上下文...而且我的应用程序有很多操作,所以每个操作都有一个Activity是有意义的。

我知道可以在Fragment内保留Activity,但由于Fragment生命周期与容器Activity密切相关,我不知道这是否是Fragment可能在活动之间保持{{1}}状态。

4 个答案:

答案 0 :(得分:34)

自API Level 13(HONEYCOMB_MR2,2011年6月)以来,您可以保存并恢复活动中片段的状态。

  • 要保存状态,请使用FragmentManager.saveFragmentInstanceState(),提供对您要保存其状态的Fragment的引用。在您尝试保存其状态时,必须附加Fragment

  • 要恢复状态,请在使用Fragment时将Fragment.setInitialSavedState()与返回值一起使用。

    myFragment = new MyFragment();
    myFragment.setInitialSavedState(appState.getMyFragmentState());
    fragmentManager.beginTransaction().add(R.id.container, myFragment).commit();
    

您可以像处理任何其他对象一样,将SavedState对象保存在各个活动中; one way is to subclass Application如上所示(appState是我们子类的实例)。

答案 1 :(得分:4)

根据您对我评论的回复,我的回答略有不同。它可能不会成为您特定情况下的最佳答案,我会让您决定。 :)

现在您正在将片段捆绑到活动中,因为这对您来说是有意义的,但实际上,您可以将整个过程视为一个活动,并使用fragment transactions隐藏&根据需要显示(或创建和销毁)片段。

由于您不会创建和销毁活动,因此左侧的菜单片段将保持不变,并且您的UI状态不会出现任何问题。您想要运行的操作集(无疑包括右侧的各种不同的片段)不需要在新活动中启动 - 但您必须找到一种方法来管理片段所需的逻辑事务(在你的一个über-activity或某种类型的OperationsManager类中)。

我认为,对于应用程序的用户来说,这将会变得更顺畅,因为单个活动仍在运行 - 而且您只是在更改实际需要更改的部分。

答案 2 :(得分:3)

  

如果我想发布新活动并保留片段F_Left ......我该怎么做?

不要发起新活动。

  

我可以在活动之间保留Fragment F_Left状态吗?

不自动。它不是同一个片段。您可以在活动之间传递数据以供片段使用,与没有任何片段的情况完全相同。

答案 3 :(得分:2)

为了回答您的原始问题,如果您启动另一个活动,那么我相信您可以通过在调用onSaveInstanceState(...)时调用FragmentManager :: putFragment(...)来保存您的第一个活动中的片段。然后再回来,比如说在onCreate(...)。

但是,我必须同意Mark D的回应。

顺便提一下,我正在做类似的事情,因为我有一个双窗格设置,左窗格如果用多个选项修复,每个选项调用右窗格中的不同片段。此外,在右窗格中选择一个条目可能会导致正确的片段被另一个片段替换。

但是,我采用的方法是,左片段仅负责显示和处理右侧窗格中出现的直接片段的响应。此外,每个右手片段负责用新片段“替换”自身并处理发送回它的结果。我正在使用setTargetFragment,getTargetFragment,并调用目标片段的onActivityResult方法来传回结果。

对我而言,我采用的方法与我的应用程序在具有单个窗格的手机上运行时没有什么不同,初始选项的活动只知道它触发的活动,随后这些新活动触发了他们的更多活动知道。

应该提到的是,我的双窗格应用程序中的活动除了加载左窗格片段之外并没有太大的作用,我不能完全看到单个活动需要管理数百个片段。