何时使用FragmentManager :: putFragment和getFragment

Spi*_*idy 41 android android-fragments

我有一个使用片段的应用程序,我正在玩如何在Activity中使用相同的片段,双窗格和Activity作为独立的.仍然不确定完成此操作的最佳方法,但我注意到FragmentManager有一个putFragment和getFragment函数.令我困惑的是,您必须为get和put函数提供Bundle作为参数.单独的活动如何拥有相同的Bundle?显然你可以将Bundle作为参数传递,但在那一点上我觉得你只是搞乱了.

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

hac*_*bod 60

基本答案:

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

他们正在解决的问题是:如果要在"已保存的实例状态"中保存对片段的引用,则不能只在其中放置对象引用.首先,因为你不能把普通对象放在Bundle中.:)这样做的原因是,保存状态的重点是将它复制出你的进程,所以如果你的进程需要被杀死,以后可以将它复制回到一个新的进程中 - 初始化你的活动/片段.原始对象仅在其运行的进程的上下文中有意义,因此无法正确地将对此对象的引用复制到当前进程之外并进入另一个对象.

所以putFragment()/ getFragment()所做的就是在给定的Bundle中放置一段数据,这些数据可以将该片段识别到另一个进程中的活动/片段的新实例.究竟这种表示是什么,没有定义,但在目前的实现方式中,该片断的内部整数标识符,将用于以后当FragmentManager需要重新创建一个先前保存的状态片段...这是使用相同的标识符重新创建,因此当您调用getFragment()时,它可以检索整数,并使用它来确定正确的Fragment对象以返回与先前保存的调用者对应的调用者.

  • 每次在onCreate中都不能通过getFragmentManager().findFragmentByTag()来实现吗? (6认同)

pol*_*len 19

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

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

  • 不要忘记那些超级电话 (6认同)
  • 难道我们不能从FragmentManager获取该片段引用吗?如果是,那我为什么要把它放在savedInstanceState中呢? (2认同)