我有一个使用片段的应用程序,我正在玩弄如何在Activity中使用相同的片段,双窗格和Activity作为独立的。仍然不确定完成此操作的最佳方法,但我注意到FragmentManager有一个putFragment和getFragment函数。令我困惑的是,您必须为get和put函数提供Bundle作为参数。单独的活动如何拥有相同的Bundle?显然你可以将Bundle作为参数传递,但在那一点上我觉得你只是搞乱了。
那么使用getFragment和putFragment的好方法是什么?请包含Bundle参数说明。
答案 0 :(得分:60)
基本答案:
这些仅在实现onSaveInstanceState()并在onCreate()中恢复该状态时才有用。如果你没有实现onSaveInstanceState(),你可以忘记这些方法并假装它们不存在。
他们正在解决的问题:如果要在“已保存的实例状态”中保存对片段的引用,则不能只在其中放置对象引用。首先,因为你不能把普通对象放在Bundle中。 :)这样做的原因是,保存状态的重点是将它复制出你的进程,所以如果你的进程需要被杀死,以后可以将它复制回到一个新的进程中 - 初始化你的活动/片段。原始对象仅在其运行的进程的上下文中有意义,因此无法正确地将对此对象的引用复制到当前进程之外并进入另一个对象。
所以putFragment()/ getFragment()所做的是在给定的Bundle中放置一段数据,该数据可以将该片段识别到另一个进程中的活动/片段的新实例。确切地说这个表示是什么,没有定义,但在当前实现中它是该片段的内部整数标识符,稍后当FragmentManager需要从先前保存的状态重新创建该片段时将使用它...它是使用相同的标识符重新创建,因此当您调用getFragment()时,它可以检索整数,并使用它来确定正确的Fragment对象以返回与先前保存的调用者对应的调用者。
答案 1 :(得分:18)
简而言之,只有在Activity
恢复后才能检索片段引用的方式。例如,当您创建片段并在整个活动中使用它时,因此在配置更改后,您的活动将被重新创建,您希望该引用返回。所以
public void onSaveInstanceState(Bundle outState){
getFragmentManager().putFragment(outState,"myfragment",myfragment);
}
public void onRetoreInstanceState(Bundle inState){
myFragment = getFragmentManager().getFragment(inState,"myfragment");
}
答案 2 :(得分:2)
您对android group thread中put|getFragment
可以使用的内容有一个很好的解释。
虽然整个帖子很有意思,但你的问题的真正答案是由Dianne Hackborn提供的“
你也可以利用 FragmentManager API保存 片段中的“指针”片段和 以后检索它,允许你 保持跨州的直接指针 保存/恢复。