首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么要使用片段?

为什么要使用片段?
EN

Stack Overflow用户
提问于 2012-03-23 01:07:34
回答 6查看 38.7K关注 0票数 68

与使用在不同布局中重用的自定义View相比,使用Fragment有什么优势?

original blog post introducing fragments中,黛安·哈克伯恩说

片段使开发人员可以更轻松地编写应用程序,这些应用程序可以在平台中已有的工具之外的各种屏幕尺寸上进行缩放。

她继续解释了在为一个应用程序制作平板电脑布局的上下文中的片段,该应用程序结合了同一个应用程序的手机版本中两个活动的UI。

但似乎使用自定义视图也可以实现相同的重用。片段和视图之间的主要区别似乎在于它们具有不同的生命周期……

Fragment的生命周期是:

onAttach()onCreate()onCreateView()onActivityCreated()onStart()onResume()onPause()onStop()onDestroyView()、<代码>D15、<代码>D16。

View的生命周期是:

ctoronFinishInflate()onAttachedToWindow()onMeasure()onLayout()onDetatchedFromWindow()

我想听听有编写大型应用程序经验的开发人员关于使用片段和自定义视图将UI划分为可重用的部分有什么好处(如果有的话)。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-02-17 00:43:42

主要原因是片段比自定义视图更具可重用性。

有时,您不能仅依靠视图来创建完全封装的UI组件。这是因为有一些东西你想放到你的视图中,但是不能,因为只有活动可以处理它们,因此在活动和视图之间强制紧密耦合。

这就是一个这样的例子。假设您想要创建一个可重用的UI组件,其中包括想要捕获一张照片并对其执行某些操作。传统上,你会发射一个意图,启动相机,并返回捕获的图像。

请注意,您的自定义UI组件不能完全封装此功能,因为它必须依赖于宿主活动的startActivityForResult,因为视图不接受活动结果(它们可以通过上下文间接触发意图)。

现在,如果您想在不同的活动中重用您的自定义UI组件,您将重复Activity.startActivityForResult的代码。

另一方面,片断干净利落地解决了这个问题。

类似地,您的片段可以向您的选项菜单贡献项目,这是传统上只有活动才能做的事情。同样,如果您的自定义视图的状态决定了菜单中的内容,那么这一点可能很重要。

票数 61
EN

Stack Overflow用户

发布于 2012-03-23 01:13:53

一个片段不仅仅是一个视图。事实上,它甚至可以完全看不到风景。它可以包含所有类型的东西,包括AsyncTasks、各种侦听器、文件和数据库访问等等。

可以将其视为一个小活动,但您可以在屏幕上显示多个它们,并与它们一起工作,包括在它们可见时相互通信。

例如,您可以在一个片段中显示购物车列表,在另一个片段中详细显示当前选择的购物车。然后,您可以在详细信息视图中更改项目的数量,列表视图可能会收到通知,并更新列表视图中的总价。你完全可以很好地编排这样的交互,同时在小屏幕设备上仍然只有一个是可见的。

我已经将一个大型业务应用程序(>15个活动)从活动重构为片段,以获得良好的平板电脑支持,并且我永远不会在没有片段的情况下启动新应用程序。

更新2016年2月:虽然上面的说法仍然成立,但碎片的复杂性导致许多人完全避免使用它们。更新的模式,如MVC方法的使用和更强大的视图,提供了替代方案。就像他们说的..。YMMV.

票数 32
EN

Stack Overflow用户

发布于 2012-03-23 01:37:56

一些描述:

把活动想象成一个盛着一块大蛋糕的盘子。Fragment是一个将相同的蛋糕切成小块的容器。每个片都包含自己的逻辑(侦听器等)。总体而言,它们与一个大蛋糕几乎没有什么不同。

好处:

  1. 当你盘子的时候,你不能拿着一个大蛋糕。(屏幕很小)您可以轻松地使用几个盘子(活动)来容纳它们,而不需要将您的逻辑移动到新的activity.
  2. Better可重用性中。我有一些实例,我可以在另一个App中完全重用一个片段。您可能会声称自定义视图也可以做到这一点。但是提到第一点,我可以通过几行布局更改来重用它,但是对于自定义视图,它必须找到一种方法来将它插入到布局和代码中。
  3. 在某种意义上,它是一种在安卓编程中组织UI逻辑的更面向对象的方法。当您有一个特性时(例如,屏幕上的一个新分区),您可以创建一个新的片段类,并对现有的活动类进行少量修改。但是,如果您仅使用activity进行编程,则需要添加逻辑并对测试类进行较大修改。

就我的两分钱。:)

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9827072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档