关于Android:在活动之间保留片段状态

Retain Fragment state between Activities

是否可以在活动之间保留一个Fragment

假设我有活动A,碎片F_Left放在左边,碎片F_Right放在右边。如果我想启动一个新的活动并保留片段F_Left…我该怎么做?

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

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

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


由于API级别13(HONEYCOMB_MR2,2011年6月),您可以保存和恢复活动中片段的状态。

  • 为了拯救国家,使用FragmentManager.saveFragmentInstanceState(),提供一个引用,指向您希望保存的Fragment的状态。在您试图保存其状态时,必须附加Fragment

  • 要恢复状态,请在插入同一个Fragment时使用返回值为Fragment.setInitialSavedState()

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

您可以像对待任何其他对象一样,在活动中持久化SavedState对象;一种方法是如上所示将Application子类(appState是我们子类的实例)。


根据你对我的评论的回应,我有一个稍微不同的答案。在你的具体情况下,这可能不是最好的答案,我让你来决定。:)

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

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

我认为对于应用程序的用户来说,这将是一个更平滑的过程,因为单个活动只是保持运行状态—而您只是更改了实际需要更改的部分。


If I want to launch a new Activity and keep Fragment F_Left... how can I do it?

不要启动新活动。

Can I retain Fragment F_Left state between activities?

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


为了潜在地回答您最初的问题,如果您触发了另一个活动,那么我相信您可以通过在调用OnSaveInstanceState(…)时调用FragmentManager::PutFagment(…)来保存第一个活动中的片段,然后稍后再获取它,例如在OnCreate(…)中。

但是,我必须同意马克D的回答。

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

然而,我已经采取了一种方法,通过这种方法,左侧片段只负责显示和处理来自右侧窗格中显示的即时片段的响应。此外,每个右侧片段负责用新片段"替换"自身,并处理返回给它的结果。我正在使用settargetfragment、gettargetfagment,并调用目标片段的onActivityResult方法来返回结果。

对于我来说,我所采用的方法与我的应用程序在一个只有一个面板的手机上运行时的方法没有什么不同,即初始选项的活动只知道它触发的活动,随后这些新的活动会触发他们知道的更多活动。

值得一提的是,除了加载左窗格片段外,我的双窗格应用程序中的活动实际上并没有做太多的工作,而且我也看不到单个活动需要管理数百个片段。