【问题标题】:FragmentManager.put/getFragment vs findFragmentByTagFragmentManager.put/getFragment 与 findFragmentByTag
【发布时间】:2014-12-02 02:09:39
【问题描述】:

更重要的是,在 onCreate/onCreateView 中,我已经调用 FragmentManager.findFragmentByTag() 来查找我的片段的任何现有实例,它似乎找到了它。

那么 putFragment/getFragment 的意义何在?它是否节省了额外的东西或导致额外的生命周期东西发生?它只是 findFragmentByTag() 的替代品,它或多或少做同样的事情吗?因为在我看来,片段会自动为我保存,而无需使用 FragmentManager.putFragment()。

【问题讨论】:

  • 那个问题和这个问题不一样,它的答案也没有以任何方式引用 FragmentManager 的先天状态保存行为。 **编辑问题标题以使这一点更清楚

标签: android android-activity android-fragments android-fragmentactivity android-lifecycle


【解决方案1】:

那么 putFragment/getFragment 的意义何在?

根据目前的实现,putFragment(Bundle bundle, String key, Fragment fragment) 所做的就是将一个片段的索引放入带有参数key的bundle中。然后getFragment(Bundle bundle, String key) 在相同索引处获取片段,该片段可以从具有相同键的捆绑包中检索。一个 Fragment 只有在添加到 FragmentManager 后才有它的索引,所以 putFragment() 只有在添加后才能在 Fragment 上调用。

它是否会节省一些额外的东西或导致额外的生命周期东西 发生了什么?

它只保存 Fragment 的索引,没有其他内容,也不会导致任何额外的生命周期内容。

它只是 findFragmentByTag() 的替代方法吗? 不一样的东西?

是的,我想是的。

根据目前的实现,putFragment/getFragment 所做的事情也可以用findFragmentByTag() 来实现。但是 putFragment/getFragment 的功能非常有限,因为没有 bundle 参数就不能使用它们,这意味着你必须在 onSaveInstanceState() 中调用 putFragment()

【讨论】:

  • 感谢您提供更详细的回复。我猜在某些情况下使用 put/get 可能比使用 findFragmentByTag() 更容易阅读......无论如何我可能会继续使用标签,因为它可以优雅地处理可能添加或不添加片段的场景。
【解决方案2】:

似乎 putFragment/getFragment 只是一种在片段管理器中存储片段及其状态而不显示它的安全方式。

例如,您有 2 个片段存储在您的活动字段中。您显示其中一个,然后在更改屏幕方向后替换另一个。活动中的字段被重新初始化,但当前显示的片段保存了其状态,而其他的则没有。但是,如果您将片段存储在片段管理器中,您将拥有两个具有实际状态的片段。

【讨论】:

  • 我的理解是,使用replace相当于从FragmentManager中移除fragment,而putFragment()只能对当前添加到fragmentmanager的fragment运行?
  • @HunterGuy2 没错,但实际上它是两个独立的存储。如果您通过事务添加片段,则意味着您将其显示并存储在片段管理器中,但是当您使用 put/get 时,您只需将其存储而不显示,与可见片段分开
  • 我的观点是,如果 put 尚未添加,我认为您不能使用它,如果已添加,则没关系。
猜你喜欢
  • 1970-01-01
  • 2019-12-11
  • 2017-09-17
  • 1970-01-01
  • 2012-06-23
  • 1970-01-01
  • 2017-12-22
  • 2018-07-14
相关资源
最近更新 更多