片段和片段活动本质上比活动更快吗?

7

片段和片段活动是否比活动本身更快?

如果我不需要在片段中加载我的活动,那么我应该使用片段活动和片段取代活动吗?

我之所以问这个问题是因为多年来我一直在使用活动,但Facebook SDK和Google Maps 2.0强制我使用片段,现在我想知道它们是否本质上“更好”,与其他实现方式相比。

如果这被认为“没有建设性”,或者“太开放了”,那么显然答案是“不是”。但如果有一些谷歌开发人员文档或博客涉及到这个问题,那么我希望能知道它。


2
片段并不是为了提高速度而存在的。引用文档中的话,“您可以将片段视为活动的模块化部分,它具有自己的生命周期,接收自己的输入事件,并且您可以在运行活动时添加或删除它(有点像您可以在不同的活动中重复使用的“子活动”)。” http://developer.android.com/guide/components/fragments.html - CommonsWare
不仅是评论,那就是答案 ;) - Snicolas
@CommonsWare 我只是不明白它们解决了什么问题。你能详细说明一下吗? - CQM
他们的目的是帮助开发人员通过将用户界面细分为可以根据可用屏幕空间重新组合的部分,从而支持多个屏幕尺寸(例如手机、平板电脑)的单个代码库。请阅读http://developer.android.com/guide/practices/tablets-and-handsets.html#Fragments,http://developer.android.com/training/basics/fragments/index.html以及那些秃头男士写的书籍。 - CommonsWare
此外,Maps V2 不强制使用片段。如果您希望,可以使用 Maps V2 的 MapView,只要您将所有生命周期方法转发给它即可,如 Maps V2 文档中所述:https://developers.google.com/maps/documentation/android/map#mapview - CommonsWare
3个回答

11

在我的上一个应用程序中,我成为Fragments的信奉者。无论它们是否计算速度更快,因为您可以基本瞬间地交换它们,包括完全支持后退堆栈,如果您做得正确(在事务上调用addToBackStack()或非常类似的内容),它们使人感觉更快。

现在,我对所有要快速浏览的导航使用Fragments/Fragment活动,例如单击行以获取更多详细信息。只有当我想要执行基本不同的操作并需要干净的工作空间时,才启动新的活动。例如,我通常有一个LoginActivity,专门处理登录/注册,至少还有一个是应用程序的核心部分。

但Fragments的基本好处仍然是它们的灵活性。我可以在其他片段之上显示片段,在不同的屏幕尺寸上重新排列它们等等。但还有很多其他好处。只是需要一段时间才能自然地感受到它们(就像最初的Activities一样)。

一个警告是,我总是后悔将Fragments嵌入到我的布局中。我不能在这里脱口而出地给出确切的理由,但本质上你只是失去了一些灵活性。相反,我为每个Fragment构建一个普通的布局,在活动布局中添加一个占位符视图,以编程方式创建该Fragment,并使用transaction.replace()将其添加到布局中。也许是因为这是我在占位符视图中交换Fragments的主要方法,而且在可能的情况下,我倾向于只使用一种方法来处理事情。


啊,我不将片段嵌入布局的另一个原因是我经常使用Bundle参数。(对于那些新手来说,你应该使用frag.setArguments(Bundle args);而不是构造函数,因为当你的Fragment被重建时,它将通过调用默认构造函数然后传递相同的args bundle来完成。) - Jay Bobzin
你还相信片段吗?我不是。我使用Conductor或其他类型的ViewGroup来在一个活动中交换东西。 - CQM

1

是的,Fragment专门为支持大屏幕高效利用区域而引入。处理Fragment非常容易且在内存方面表现良好。但是嵌套Fragment会带来麻烦。


0

如果您想要分割屏幕,片段非常有用。这样,您可以在同一屏幕上拥有不同的视图。另一种使用片段的方式是,假设您有选项卡来对项目进行分类。您可以将服装、鞋子作为选项卡。每个选项卡都将有一个片段来容纳产品。选项卡可以保存在活动或片段中。我发现片段比活动稍微快一些,但在大多数情况下,这并不是您真正会注意到的事情。无论它们是否旨在提高速度,它们仍然似乎/感觉稍微快一些。

使用片段的缺点是,某些回调(例如onBackPressed)仅适用于活动。片段无法访问此内容。我经常发现最好尽可能地减少活动数量。还要记住,活动不仅是视图,它们也是屏幕。而片段只是一个视图,没有屏幕。工具栏/操作栏等仅适用于活动,但是如果您使用自定义工具栏,则可以通过实现onTouch(如果不是按钮而是某个对象)或onClick(按钮)在片段中使用它们,这些方法将为您提供所需的内容。因此,确实存在一些缺点,但至少其中几个几乎都有解决方法。

我确实同意片段转换非常棒,并且在使用后退按钮和onBackPressed时弹出堆栈可以解决问题。

我经常在父活动中使用switch语句等来查看哪个片段需要显示,我经常使用接口传递bundle等更新它。不确定是否有其他人发现更有效的方法。但是当切换视图时,我确实发现它非常有用。

是的,对于大多数事情来说,片段都是顶级的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接