【问题标题】:Is the `FragmentManager` independent of activity lifecycle?`FragmentManager` 是否独立于活动生命周期?
【发布时间】:2022-03-17 01:04:24
【问题描述】:

我正在阅读 Handling Configuration Changes 文档。

文档建议使用将setRetainInstance 设置为true 的片段,然后通过fragmentManager's findFragmentByTag 方法恢复片段。

我的问题是,当活动被破坏时,fragmentManager 会存活下来吗?是否像sharedPreferences 一样,只要提交了值,存储在其中的值就不会受到活动中发生的事情的影响?

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    没有。当您在片段的 onCreate 中设置 setRetainInstance(true)(带有片段标记,例如“my_fragment”)时,当您的父活动方向发生变化时,android 框架会将片段的实例存储为 只要活动没有被破坏。当您将片段标签变量保存在父活动中并恢复时(参见示例:https://stackoverflow.com/a/47823139/7152359),您可以再次调用 getSupportFragmentManager()... 并使用您存储的标签“my_fragment”设置片段。

    简单来说,setRetainInstance(true) 只是用来帮助开发者不要像很多开发者在活动中必须做的那样经历复杂/冗长的 onSaveInstanceState(..) 和 onRestoreInstanceState(..) 过程。

    【讨论】:

    • 明确地说,您是说fragmentManager 不会在配置更改后继续存在。正确的?因为活动在这个过程中被破坏了。如果是这种情况,当再次调用onCreategetFragmentManager 时,我如何仍然能够检索我保存的片段?
    • 哥们,onDestroy有两种不同的解释。一旦您在活动中覆盖了 onDestroy () 函数,您还可以使用函数 isFinishing() 来检测活动是否实际被销毁(真)或是否是配置更改(假)。当 isFinishing 返回 false 时,setRetainInstance 在 onDestroy 中仍然存在。
    • 我明白了!谢谢你。这就解释了。
    【解决方案2】:

    根据我今天的调查,我相信 FragmentManager 确实能够在配置更改导致的活动破坏中幸存下来。这是因为如果您将带有标签的片段添加到片段管理器(例如,fragmentManager.beginTransaction().replace(R.id.container, myFragment, "blah").commit()),那么即使在活动因配置而被销毁并重新创建后,您仍然可以使用fragmentManager.findFragmentByTag("blah") 检索该片段改变。从源代码中可以看到,它保留了一个ArrayList<Fragment> mAdded,其中包含了所有这些之前添加的片段。如果 FragmentManager 被销毁并重新创建,这个 mAdded 将成为一个空列表,显然不是上述情况。

    但是,每个片段中保留的内容的性质取决于setRetainInstance。如果不设置retain,那么只有片段参数和保存的实例状态被持久化,片段实例由框架重新创建。如果您确实设置了保留,则整个实例(包括字段)将被保留。但是无论哪种方式,FragmentManager 本身仍然存在,否则我们将无法再从中检索标签。

    虽然文档中没有明确提及 FragmentManager 在配置更改中的持久性,但我相信以下语句暗示了这一点:

    在配置更改期间,您的 Activity 及其所有片段都会被销毁,然后使用最适用的 Android 资源重新创建。 FragmentManager 为您处理所有这些。它重新创建片段实例,将它们附加到主机,并重新创建返回堆栈状态。

    即如果 FragmentManager 没有在配置更改中持续存在,则在重新创建活动后无法继续管理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-18
      • 1970-01-01
      • 1970-01-01
      • 2013-01-13
      • 2011-12-18
      • 1970-01-01
      • 2019-04-17
      相关资源
      最近更新 更多