何时使用FragmentManager :: putFragment和getFragment

我有一个应用程序使用片段,我正在玩如何在一个活动中使用同一个片段,双窗格和一个活动作为一个独立的。 仍然不确定完成这个最好的方法,但我注意到FragmentManager有一个putFragment和getFragment函数。 我感到困惑的是,你必须提供一个Bundle作为参数来获取和放置函数。 如何分开活动有相同的捆绑? 显然你可以通过捆绑作为参数,但在这一点上,我觉得你只是把事情弄得一团糟。

那么使用getFragment和putFragment的好方法是什么? 请包括Bundle参数说明。

基本答案:

这些仅在实现onSaveInstanceState()并在onCreate()中恢复该状态时才有用。 如果你没有实现onSaveInstanceState(),你可以忘记这些方法,并假装他们不存在。

他们正在解决的问题是:如果你想在“保存的实例状态”中保存一个片段的引用,你不能只把一个对象引用放在那里。 首先,因为你不能把普通的对象放在Bundle中。 :)原因是保存状态的目的是将它复制出你的进程,所以如果你的进程需要被终止,它可以被复制回到一个新的进程中, – 从您的活动/片段初始化。 原始对象只在运行它的进程的上下文中有意义,因此不可能正确地将引用从当前进程复制到另一个进程中。

那么putFragment()/ getFragment()所做的就是在给定的Bundle中放置一段数据,以便在另一个进程中将该片段标识为您的活动/片段的新实例。 到底什么是这种表示是没有定义的,但在当前实现中,它是该片段的内部整数标识符,稍后将在FragmentManager需要从之前保存的状态重新创build该片段时使用它…用相同的标识符重新创build,所以当你调用getFragment()它可以检索整数,并使用它来确定正确的Fragment对象返回到与以前保存的对应的调用方。

简而言之,只有在Activity恢复后才能检索片段的引用。 例如,当您创build一个片段并在整个活动中使用它时,所以在configuration更改之后,您的活动将被重新创build,您需要重新引用该片段。 所以

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

你有一个很好的解释是什么put|getFragment可以在这个android组线程中使用 。

虽然整个线程很有趣,但是对于你的问题的真正答案是由Dianne Hackborn“

您还可以利用FragmentManager API将一个片段“指针”保存在一个包中,稍后将其检索到,以允许您维护跨状态保存/恢复的直接指针。