Android 何时使用FragmentManager::putFragment和getFragment

Android 何时使用FragmentManager::putFragment和getFragment,android,android-fragments,Android,Android Fragments,我有一个使用片段的应用程序,我正在研究如何在带有双窗格的活动中使用相同的片段,并将活动作为独立活动。仍然不确定完成此任务的最佳方法,但我注意到FragmentManager有一个putFragment和getFragment函数。让我困惑的是,您必须提供一个Bundle作为get和put函数的参数。不同的活动如何拥有相同的捆绑包?显然,您可以将Bundle作为参数传递,但在这一点上,我觉得您只是在把事情弄得一团糟 那么,使用getFragment和putFragment的好方案是什么呢?请包括B

我有一个使用片段的应用程序,我正在研究如何在带有双窗格的活动中使用相同的片段,并将活动作为独立活动。仍然不确定完成此任务的最佳方法,但我注意到FragmentManager有一个putFragment和getFragment函数。让我困惑的是,您必须提供一个Bundle作为get和put函数的参数。不同的活动如何拥有相同的捆绑包?显然,您可以将Bundle作为参数传递,但在这一点上,我觉得您只是在把事情弄得一团糟


那么,使用getFragment和putFragment的好方案是什么呢?请包括Bundle参数解释。

您对
put | getFragment
可以在其中使用的内容有很好的解释

虽然整条线索都很有趣,但你的问题的真正答案是由黛安娜·哈克伯恩给出的。”

您还可以利用 FragmentManager API以保存 捆绑包中的片段“指针”和 稍后检索它,以允许您 维护跨州的直接指针 保存/还原

基本答案是:

只有在实现onSaveInstanceState()并在onCreate()中还原该状态时,这些方法才有用。如果您没有实现onSaveInstanceState(),您可以忘记这些方法,假装它们不存在

他们正在解决的问题是:如果您想在“保存的实例状态”中保存对片段的引用,“不能只在其中放置对象引用。首先是因为你不能把普通对象放在一个包里这是因为保存状态的要点是将其从流程中复制出来,因此如果需要终止流程,可以稍后将其复制回新流程中,以便重新初始化活动/片段。原始对象仅在其运行的进程的上下文中才有意义,因此不可能将对此类对象的引用从当前进程复制到另一个进程


因此,putFragment()/getFragment()所做的是将一段数据放在给定的捆绑包中,该捆绑包可以将该片段标识到另一个流程中的活动/片段的新实例中。此表示形式的确切含义尚未定义,但在当前实现中,它是该片段的内部整数标识符,稍后当FragmentManager需要从先前保存的状态重新创建该片段时,将使用该标识符。。。它是使用相同的标识符重新创建的,因此当您调用getFragment()时,它可以检索整数,并使用该整数确定要返回给调用方的正确片段对象,该对象对应于先前保存的对象。

简言之,这正是在
活动
恢复后可以检索片段引用的方法。例如,当您创建一个片段并在整个活动中使用它时,所以在配置更改之后,您的活动将被重新创建,您希望返回该引用。所以

public void onSaveInstanceState(Bundle outState){
   getFragmentManager().putFragment(outState,"myfragment",myfragment);
}
public void onRetoreInstanceState(Bundle inState){
   myFragment = getFragmentManager().getFragment(inState,"myfragment");
}

我知道
putFragment
将与
onSaveInstanceState
结合使用,以维护对片段的引用,如果活动在方向更改时被破坏,或者如果操作系统需要回收内存,那么片段将在say
onCreate(…)
中检索。最好知道的是您可能希望维护引用的示例。我刚刚完成了一个fragment port项目,但我从来没有这样做过,虽然也许我应该这样做。我有一个双窗格布局,用于横向和纵向,在方向更改时为其重新创建活动。在方向更改时,我的片段确实会被重新创建并加载到它们的容器中,因此如上所述,我没有发现使用
put | getFragment
的必要性,因此任何关于何时使用的好例子都是好的。安卓令人难以置信的愚蠢架构正在折磨我……感谢您的参考。读过这篇文章后,我仍然有点不确定什么时候我可以最好地使用这些方法(可能是因为我不明白)。我使用了这些方法通过标记检索片段,并使用了一个侦听器。。。很遗憾,api演示示例没有包括这些方法的使用。@PJL:您是否使用过saveInstanceState上的
onSaveInstanceState
?Reto Meier对此给出了一个很好的回答:
put | getFragment
,正如Dianne所提到的,它将完全用于此目的,但是在处理
片段时。感谢链接。我确实使用了saveInstanceState上的
,也就是说,对于我的双窗格左片段列表,我使用它来保存当前选择的位置(根据FragmentLayout),但是,我不需要与右侧片段通信。这很有意义。再次谢谢你,谢谢。很抱歉在假期,我自己无法奖励赏金。这不能由getFragmentManager()实现吗?每次在onCreate中findFragmentByTag()都可以实现吗?别忘了那些超级调用。我们不是刚从FragmentManager获得片段引用吗?如果是,那我为什么还要把它放在savedInstanceState呢?