为什么要使用碎片?

avh*_*avh 67 android android-fragments

Fragment使用Views而不是在不同布局中重用的自定义s有什么好处?

最初介绍片段的博客文章中,Dianne Hackborn说

[片段]使开发人员可以更轻松地编写可扩展到各种屏幕大小的应用程序,而不仅仅是平台中已有的工具.

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

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

Fragment生命周期是:

onAttach(),onCreate(),onCreateView(),onActivityCreated(),onStart(),onResume(),onPause(),onStop(),onDestroyView(),onDestroy(),onDetatch().

View生命周期是:

ctor,onFinishInflate(),onAttachedToWindow(),onMeasure(),onLayout(),onDetatchedFromWindow()

我想听听开发人员在编写大型应用程序方面的经验,这些应用程序讲述了他们在使用Fragments和自定义视图时将UI划分为可重用部分的好处(如果有的话).

num*_*ati 56

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

有时,您无法单独依赖视图来创建完全封装的UI组件.这是因为您希望将某些内容添加到视图中但不能,因为只有一个Activity可以处理它们,从而迫使Activity和View之间紧密耦合.

这是一个这样的例子.假设您想创建一个可重用的UI组件,在许多方面,它想要捕获照片并使用它做一些事情.传统上,您会启动启动相机的意图并返回捕获的图像.

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

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

另一方面片段干净地解决了这个问题.

同样,您的片段可以为您的选项菜单提供项目,传统上只有活动可以做.如果您的自定义视图的状态决定菜单中的内容,这可能很重要.


Man*_*ser 32

片段不仅仅是一种观点.事实上,它甚至可以完全没有观点.它可以包含各种各样的东西,包括AsyncTasks,各种监听器,文件和数据库访问等等.

可以把它想象成一个小活动,但你可以在屏幕上拥有多个活动,并与它们一起工作,包括在它们可见时相互通信.

例如,您可以在一个片段中显示购物车列表,在另一个片段中详细显示当前选定的购物车.然后,您可以在详细视图中更改项目的数量,并且可以通知列表视图,并在列表视图中更新总价格.您可以完全协调这样的交互,例如在较小的屏幕设备上只能看到其中一个.

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

2016年2月更新:虽然上述情况仍然适用,但片段的复杂性导致许多人完全避免使用它们.较新的模式,如MVC方法的使用和更强大的视图提供了替代方案.正如他们所说.. YMMV.

  • 但我可以实现您刚刚使用自定义视图提供的示例.您可以让视图相互通信,并检查操作系统是否正在使用平板电脑或电话布局.我看到人们对片段做了同样的事情.使用片段而不是视图实现它有什么好处? (13认同)

Cal*_*vin 9

一些描述:

想象活动作为一个盛有一块大蛋糕的盘子.片段将是将相同的蛋糕切成片的容器.每个切片都包含它自己的逻辑(监听器等).总的来说,它们与一个大蛋糕几乎没有什么不同.

好处:

  1. 当你盘子不能抱一个大蛋糕.(屏幕很小)您可以轻松使用几个板(活动)来保存每个板,而无需将逻辑移动到新活动中.

  2. 更好的可重用性.我有一些实例,我可以在另一个应用程序中完全重用一个片段.您可能声称自定义视图也可以这样做.但是参考第1点,我只需要几行布局更改就可以重用它,但是对于自定义视图,它必须找到一种方法将它插入到布局和代码中.

  3. 从某种意义上说,它是在Android编程中组织UI逻辑的更多OO方式.当您具有某个功能(例如,屏幕上的新分区)时,您将创建一个新的Fragment类,并对现有活动类进行少量修改.但是,如果您只使用活动进行编程,则需要添加逻辑并对测试类进行大修改.

只需2美分.:)

  • 但是您可以轻松地将逻辑封装在您制作的每个蛋糕中,而无需使用片段。我可以做一个很好的干净活动,只有一两行代码可以创建并实例化一块蛋糕。所有逻辑都在蛋糕课上 (2认同)