Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android FragmentManager.put/getFragment vs findFragmentByTag_Android_Android Activity_Android Fragments_Android Fragmentactivity_Android Lifecycle - Fatal编程技术网

Android FragmentManager.put/getFragment vs findFragmentByTag

Android FragmentManager.put/getFragment vs findFragmentByTag,android,android-activity,android-fragments,android-fragmentactivity,android-lifecycle,Android,Android Activity,Android Fragments,Android Fragmentactivity,Android Lifecycle,更重要的是,在onCreate/onCreateView中,我已经调用FragmentManager.findFragmentByTag()来查找我片段的任何现有实例,它似乎找到了它 那么putFragment/getFragment的意义是什么呢?它是否节省了一些额外的东西,或者导致了其他生命周期的事情发生?它只是findFragmentByTag()的一种替代方法,它的功能大致相同吗?因为在我看来,片段是自动为我保存的,而不需要使用FragmentManager.putFragment()。

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


那么putFragment/getFragment的意义是什么呢?它是否节省了一些额外的东西,或者导致了其他生命周期的事情发生?它只是findFragmentByTag()的一种替代方法,它的功能大致相同吗?因为在我看来,片段是自动为我保存的,而不需要使用FragmentManager.putFragment()。

看起来像putFragment/getFragment,它只是一种在片段管理器中存储片段及其状态的安全方法,而无需显示它

例如,有两个片段存储在活动字段中。您可以显示其中一个,然后在更改屏幕方向后替换另一个。“活动”中的字段已重新设置,但当前显示的片段已保存其状态,而其他字段未保存。但如果您将片段存储在片段管理器中,您将有两个具有实际状态的片段

那么putFragment/getFragment的意义是什么呢

根据当前的实现,
putFragment(Bundle Bundle,String key,Fragment Fragment)
所做的是使用参数键将片段的索引放入Bundle中。然后
getFragment(Bundle Bundle,String key)
获取相同索引处的片段,该片段可以使用相同的键从Bundle中检索。片段只有在添加到FragmentManager中后,才会在FragmentManager中具有其索引,因此只有在添加片段后才能对其调用putFragment()

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

它只保存一个片段的索引,不再保存其他内容,也不会导致任何额外的生命周期内容

它只是findFragmentByTag()的一种替代方法,可以执行更多或更多的操作吗 不太一样吗

是的,我想是这样


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

请参阅该问题与此问题不同,它的答案也没有以任何方式提及FragmentManager天生的状态保存行为**编辑问题标题使其更清晰我的理解是,使用替换相当于从FragmentManager中删除片段,putFragment()只能在当前添加到FragmentManager的片段上运行?@HunterGuy2没错,但实际上它是两个分开的存储。如果您通过事务添加片段,这意味着您可以在片段管理器中显示和存储它,但当您使用put/get时,您只需存储它而不显示,与可见片段分开。我的观点是,如果尚未添加,我认为您不能使用put,如果已添加,则无所谓。感谢您提供更详细的答复。我想在某些情况下,使用put/get可能比使用findFragmentByTag()更容易阅读。。。无论如何,我可能会继续使用标记,因为它优雅地处理可能添加或不添加片段的场景。