2

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

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

+0

请参阅http://stackoverflow.com/questions/6446961/when-to-use-fragmentmanagerputfragment-and-getfragment – 2014-12-02 02:28:21

+0

该问题与此问题不一样,其答案也不涉及FragmentManager的先天状态保存行为以任何方式。 **编辑问题标题,使其更清晰 – 2014-12-02 02:49:06

回答

3

那么putFragment/getFragment有什么意义?

根据当前实现,putFragment(Bundle bundle, String key, Fragment fragment)所做的是将片段的索引放入带有参数关键字的包中。然后getFragment(Bundle bundle, String key)在相同的索引处获取片段,该索引可以使用相同的密钥从包中检索。 Fragment只有在被添加到FragmentManager中后,才会在FragmentManager中创建它的索引,所以putFragment()只有在被添加后才能在Fragment上调用。

是否会节省额外的东西或导致额外的生命周期的东西 发生?

它只保存片段的索引,没有更多的东西,也不会导致任何额外的生命周期的东西。

它只是一个替代findFragmentByTag()做更多或 不太相同的东西吗?

是的,我thik所以。

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

+0

感谢您的更详细的回复。我想用put/get也许在某些情况下比使用findFragmentByTag()更容易阅读...无论如何,我可能会继续使用标签,因为它可以优雅地处理可能会或可能不会添加片段的场景。 – 2014-12-02 07:27:34

0

看起来像putFragment/getFragment它只是一个安全的方式来存储片段及其状态在片段管理器中而不显示它。

例如,您有2个片段存储在您的活动字段中。您显示其中一个,然后在您更改屏幕方向后再替换它。您的活动中的字段会被重新启动,但当前显示的片段会保存其状态,其他则不会。但是,如果您将片段存储在片段管理器中,则会有两个片段与实际状态。

+0

我的理解是,使用替换等同于从FragmentManager中删除片段,并且putFragment()只能在当前添加到fragmentmanager的片段上运行? – 2014-12-02 02:55:49

+0

@ HunterGuy2这是正确的,但实际上它是两个分开的存储。如果您通过事务添加片段,则意味着您将其显示并存储在片段管理器中,但是当您使用put/get时,只是将其存储而不显示,与可见片段分开 – Stepango 2014-12-02 08:37:36

+0

我的观点是我认为如果它不可用还没有添加,如果添加,那么它并不重要。 – 2014-12-03 19:52:11

相关问题