9

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

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

谢谢!

4

1 回答 1

3

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

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

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

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

Fragment 对象被销毁但可见元素(如果有)是。当 Fragment 被重新连接时,attach()它的 View 层次结构被重新创建(docs):

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

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

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

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

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

于 2013-03-05T21:55:28.097 回答