15

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

假设我有 Activity A,其中 FragmentF_Left放在左侧,FragmentF_Right放在右侧。如果我想启动一个新的 Activity 并保留 Fragment F_Left......我该怎么做?

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

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

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

4

4 回答 4

34

从 API 级别 13(HONEYCOMB_MR22011 年 6 月)开始,您可以跨活动保存和恢复片段的状态。

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

  • 要恢复状态,Fragment.setInitialSavedState()请在执行相同时使用 with 返回值Fragment

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

您可以像处理任何其他对象一样跨活动持久化SavedState对象;一种方法是Application如上所示进行子类化(appState是我们子类的实例)。

于 2012-09-17T18:45:54.470 回答
4

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

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

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

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

于 2011-05-18T16:43:14.470 回答
3

如果我想启动一个新的 Activity 并保留 Fragment F_Left ......我该怎么做?

不要启动新的活动。

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

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

于 2011-05-17T16:50:27.103 回答
2

为了可能回答您最初的问题,如果您启动另一个活动,那么我相信您可以通过调用 FragmentManager::putFragment(...) 在调用 onSaveInstanceState(...) 然后获取它来保存您的第一个活动稍后返回,例如在 onCreate(...) 中。

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

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

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

对我来说,我采取的方法与我的应用程序在具有单个窗格的手机上运行时没有什么不同,其中初始选项的活动只知道它触发的活动,然后这些新的活动触发他们知道的进一步活动。

应该提到的是,我在双窗格应用程序中的活动除了加载左窗格片段之外并没有真正做太多事情,而且我看不出需要一个活动来管理数百个片段。

于 2011-05-19T14:48:29.710 回答