【问题标题】:When to use FragmentManager::putFragment and getFragment何时使用 FragmentManager::putFragment 和 getFragment
【发布时间】:2011-06-22 21:48:32
【问题描述】:

我有一个使用片段的应用程序,我正在研究如何在具有双窗格的 Activity 和作为独立的 Activity 中使用相同的片段。仍然不确定完成此操作的最佳方法,但我注意到 FragmentManager 具有 putFragment 和 getFragment 函数。让我感到困惑的是,您必须为 get 和 put 函数提供一个 Bundle 作为参数。不同的活动如何具有相同的Bundle?显然,您可以将 Bundle 作为参数传递,但那时我觉得您只是把事情搞砸了。

那么什么是使用 getFragment 和 putFragment 的好场景呢?请附上Bundle参数说明。

【问题讨论】:

  • 我知道putFragment 将与onSaveInstanceState 一起使用以维护对片段的引用,如果活动在说方向更改或操作系统需要回收内存时被破坏,则在onCreate(...) 中检索到的片段。最好知道什么时候您可能想要维护参考的示例。我刚刚完成了一个片段端口项目,我从来没有这样做过,尽管也许我应该这样做。
  • 我有一个横向和纵向的双窗格布局,其活动在方向更改时重新创建。在方向更改时,我的片段确实会重新创建并加载到它们的容器中,因此如上所述,我没有发现使用 put|getFragment 的必要性,因此任何何时使用的好例子都会很好。
  • android 令人难以置信的白痴架构让我丧命......

标签: android android-fragments


【解决方案1】:

基本答案:

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

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

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

【讨论】:

  • 这很有意义。谢谢hackbod
  • 再次感谢。抱歉放假了,所以不能自己奖励赏金。
  • 在onCreate中每次getFragmentManager().findFragmentByTag()不能实现吗?
【解决方案2】:

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

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

【讨论】:

  • 别忘了那些超级电话
  • 我们不能从 FragmentManager 获取片段引用吗?如果是,那我为什么还要把它放在 savedInstanceState 中?
【解决方案3】:

您很好地解释了put|getFragment 在这个android group thread 中的用途。

虽然整个话题很有趣,但你的问题的真正答案是由 Dianne Hackborn 给出的”

您还可以利用 FragmentManager APIs 来保存一个 捆绑中的片段“指针”和 稍后检索它,以允许您 维护跨状态的直接指针 保存/恢复。

【讨论】:

  • 感谢您的参考。我仍然有点不确定是否已经阅读了这篇文章,了解何时最好使用这些方法(可能是我没有得到它)​​。我已经使用了通过标签检索片段的方法并使用了监听器......很遗憾 api 演示示例不包括这些方法的使用。
  • @PJL:你用过onSaveInstanceState吗?这是来自 Reto Meier 的一个很好的回答:stackoverflow.com/questions/151777/… put|getFragment,正如 Dianne 所提到的,将用于此目的,但在处理 Fragments 时。
  • 感谢您的链接。我确实使用onSaveInstanceState,即对于我的双窗格左侧片段列表,我使用它来保存当前选择的位置(根据 FragmentLayout),但是,我不需要与右侧片段进行通信。
猜你喜欢
  • 1970-01-01
  • 2019-02-14
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
  • 2012-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多