【问题标题】:When to attach/detach Android Fragments by hand?何时手动附加/分离 Android 片段?
【发布时间】:2012-06-03 21:05:15
【问题描述】:

我已经深入阅读了Fragments documentation,但没有看到对FragmentTransaction.attach()FragmentTransaction.detach() 方法的任何引用。但是,我发现了多个教程和演示,他们实际使用它们(如FragmentTabs Demo)。我的问题是:

  1. 理论上,您应该在什么时候手动附加/分离片段
  2. 附加/分离片段时究竟会发生什么? (它是否被创建/销毁?暂停/恢复?等等?)
  3. 手动附加/分离片段是一种好习惯吗?

谢谢!

【问题讨论】:

  • “手工”一词令人困惑!

标签: android android-fragments


【解决方案1】:

Android 开发团队正在推动 Fragment 作为前进的方向。他们介绍的原因记录在网络上的各个地方,我不会在这里讨论。引入它们的原因之一是允许开发人员将其应用程序的特定功能封装到(几乎)可以根据需要加载和卸载的独立模块中,并最大限度地扩大 Android 平台可用的设备屏幕范围。

不幸的是(以我的拙见)片段带有一些微妙之处,可以抓住粗心的开发者(我就是其中之一)。虽然我不能声称自己是 Fragments 的任何权威,但我可以传递我在使用它们时发现的东西。所以回答你的问题:

我不认为有任何硬性规定应该手动进行attach()/detach() 片段。但是,在某些情况下,您可能想要分离一个片段而不是用另一个片段替换它。但是请注意,这不会破坏 docs 中所述的 Fragment

从 UI 中分离给定的片段。这与它被放入回栈时的状态相同:片段从 UI 中移除,但其状态仍由片段管理器主动管理。当进入这种状态时,它的视图层次结构被破坏。

Fragment 对象被销毁但可见元素(如果有)是。当 Fragment 使用attach() 重新附加时,它的视图层次结构被重新创建(docs):

在之前使用 detach(Fragment) 将 Fragment 与 UI 分离后重新附加该 Fragment。这会导致其视图层次结构被重新创建、附加到 UI 并显示。

我发现,如果您在后台的 Fragment 需要更新它的 View 层次结构,以便在您返回 View 时立即更新,这并不是特别有用。最终结果是你得到一个“丑陋”的片段重绘。我的意思是丑陋,因为它使您的应用看起来匆忙且不专业地重新绘制自身,而不是更令人向往的“准备就绪”的空气。

如果保持最新的 Fragment UI 至关重要,那么有一些方法可以避免这种重新绘制。您可以简单地 show()hide() 它们,而不是附加和分离您的片段。这避免了重新创建 View 层次结构,但您必须小心,当 Fragment 隐藏时,View 中的任何内容都不会尝试重新绘制自己;这将导致异常(我认为。我已经有一段时间没有修补这些东西了)。

手动附加和分离 Fragment 并没有错,您可能应该认为这些方法是由 Android 开发人员提供的,“以防万一”您需要做这样的事情。此外,我认为replace() 无论如何都会调用这些更“原子”的方法。

至于 Fragment 被销毁时,显然它们在应用程序关闭时被销毁,但否则我怀疑它们只是落入正常的垃圾程序(但不要引用我的话!)。即,如果没有对该对象的引用,则将其标记为销毁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 2018-01-24
    相关资源
    最近更新 更多