我已经深入阅读了Fragments documentation,但我没有看到对FragmentTransaction.attach()或FragmentTransaction.detach()方法的任何引用。但是,我发现了他们实际使用它们的多个教程和演示(如FragmentTabs Demo)。我的问题是:
谢谢!
答案 0 :(得分:1)
Android开发团队正在推动碎片作为前进的方向。有关他们的介绍的原因记录在网上的各个地方,我不会在这里介绍。引入它们的一个原因是允许开发人员将其应用程序的特定功能封装到(几乎)独立模块中,这些模块可以适当地加载和卸载,并最大化Android平台可用的各种设备屏幕。
不幸的是(根据我的拙见),碎片带来了一些细微之处,可以找出那些粗心大意的开发者(我就是其中之一)。虽然我不能声称对片段有任何权威,但我可以传递我在使用时发现的内容。所以回答你的问题:
当你attach()/detach()
手工碎片时,我不相信有任何硬性规则。但是,您可能希望分离片段而不是将其替换为另一片段。但请注意,这不会破坏docs
从UI中分离给定的片段。这与将其放在后台堆栈时的状态相同:片段从UI中删除,但其状态仍由片段管理器主动管理。进入此状态时,其视图层次结构将被销毁。
Fragment对象被销毁但是可见元素(如果有的话)是。当片段与attach()
重新附加时,其视图层次结构将重新创建(docs):
使用detach(Fragment)从先前已从UI分离之后重新附加片段。这会导致其视图层次结构被重新创建,附加到UI并显示。
正如我所发现的那样,如果您的后台片段需要更新它的View层次结构,那么当您返回View时它立即是最新的,这不是特别有用。最终结果是你得到了一个'丑陋'的重新绘制你的片段。我的意思是丑陋,因为它给你的应用程序带来了匆忙和不专业地重新绘制自己的外观,而不是一个更加理想的“随时可以离开”的空气。
如果维护最新的Fragment UI至关重要,那么有办法避免重新绘制。您只需show()和hide(),而不是附加和分离您的片段。这样可以避免重新创建View层次结构,但是必须注意View中的任何内容都不会在隐藏Fragment时重新绘制自己;这将导致异常(我认为。自从我修改这些东西以来已经有一段时间了。)
通过手动附加和分离Fragments没有任何问题,你应该认为这些方法是由Android开发人员提供的“只是在案例”你需要做这样的事情。此外,无论如何,我想象replace()
调用这些更“原子”的方法。
当片段被销毁时,显然它们会在应用程序关闭时被销毁,但我怀疑它们只是陷入正常的垃圾程序(但不要引用我的话!)。即如果没有对该物体的引用,则将其标记为销毁。