android - 何时手动附加/分离 Android fragment ?

标签 android android-fragments

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

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

谢谢!

最佳答案

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

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

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

Detach the given fragment from the UI. This is the same state as when it is put on the back stack: the fragment is removed from the UI, however its state is still being actively managed by the fragment manager. When going into this state its view hierarchy is destroyed.

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

Re-attach a fragment after it had previously been detached from the UI with detach(Fragment). This causes its view hierarchy to be re-created, attached to the UI, and displayed.

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

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

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

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

关于android - 何时手动附加/分离 Android fragment ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10802570/

相关文章:

java - 从JSONarray中获取具体值

java - 关于 Android 中 Java 类对象和从一个 Activity 到另一个 Activity 的数据传输的查询

android - 以编程方式覆盖文本文件

android - 使用 Espresso 确定按钮是否不可点击

android - 通过单击/触摸外部 : 删除 fragment

android - Gradle 构建运行需要很长时间

android - 从 RecyclerView Adapter 打开 fragment

android - 将 fragment 添加到对话框 fragment

android - 在 Activity 中显示 fragment - 无法实例化类

android - 使 Sliding TabLayout 中的标签不滑动