我知道Activities被设计为代表我的应用程序的单个屏幕,而Fragments被设计为可重用的UI布局,其中嵌入了逻辑。

直到不久前,我开发了一个应用程序,因为它说应该开发它们。我创建了一个“活动”来表示我的应用程序的屏幕,并将碎片用于ViewPager或谷歌地图。我很少创建可以多次重用的ListFragment或其他UI。

最近,我偶然发现一个项目只包含两个活动,一个是SettingsActivity,另一个是MainActivity。MainActivity的布局中填充了许多隐藏的全屏UI片段,仅显示一个。在“活动”逻辑中,应用程序的不同屏幕之间有许多FragmentTransition。

我喜欢这种方法的地方是,因为应用程序使用了ActionBar,所以它保持不变,不会随着屏幕切换动画而移动,这就是“活动切换”所发生的情况。这使屏幕转换更加流畅。

所以我想我要问的是分享你当前关于这个主题的开发方式,我知道这看起来可能是一个基于观点的问题,但我将其视为一个Android设计和架构问题。。。并不是一个真正基于观点的人。

更新(2014年5月1日):以下是来自Square的Eric Burke的演示(我不得不说,这是一个很棒的演示,为android开发人员提供了很多有用的工具。我与Square没有任何关系)

http://www.infoq.com/presentations/Android-Design/

根据过去几个月的个人经验,我发现构建应用程序的最佳方法是创建一组片段,这些片段代表应用程序中的一个流,并在一个活动中呈现所有这些片段。因此,基本上,应用程序中的活动数与流数相同。这样,动作栏在所有流的屏幕上保持不变,但在更改流时会重新创建,这非常有意义。正如埃里克·伯克(Eric Burke)所说,正如我所认识到的那样,使用尽可能少的活动的哲学并不适用于所有情况,因为它在他所谓的“上帝”活动中造成了混乱。


当前回答

专家会告诉你:“当我看到UI时,我会知道是使用活动还是片段”。在一开始,这将没有任何意义,但随着时间的推移,你将能够知道你是否需要Fragment。

我发现有一个很好的做法对我很有帮助。当我试图向女儿解释一些事情时,我突然想到了这一点。

也就是说,想象一个代表屏幕的盒子。你能在这个盒子里再装一个屏幕吗?如果使用新框,是否必须从第一个框复制多个项目?如果答案是Yes,那么您应该使用Fragments,因为根Activity可以保存所有重复的元素,以节省创建它们的时间,并且您可以简单地替换方框的部分。

但别忘了,你总是需要一个盒子容器(Activity),否则你的零件会被分散。所以一个盒子里面有零件。

小心不要误用箱子。Android用户体验专家建议(你可以在YouTube上找到他们),何时我们应该显式加载另一个“活动”,而不是使用“片段”(比如当我们处理有类别的导航抽屉时)。一旦你对碎片感到舒适,你就可以观看他们的所有视频。更重要的是,它们是强制性材料。

你现在能看看你的UI并确定你是否需要一个活动或片段吗?你有新的视角吗?我想你做到了。

其他回答

这比你意识到的要多,你必须记住,启动的活动不会隐式地破坏调用活动。当然,您可以将其设置为用户单击某个按钮转到某个页面,然后启动该页面的活动并销毁当前页面。这会导致大量开销。我能给你最好的指导是:

**只有当主活动和此活动同时打开(考虑多个窗口)才有意义时,才能开始新活动。

Google Drive就是一个很好的例子,它说明了多个活动是有意义的。主要活动提供文件资源管理器。打开文件后,将启动一个新活动来查看该文件。您可以按下最近的应用程序按钮,这将允许您在不关闭打开的文档的情况下返回浏览器,然后甚至可以打开与第一个文档并行的另一个文档。

这个问题需要重新评估,因为Jetpack Compose已经达到稳定。

Jetpack Compose是Android推荐的用于构建本机UI。从…起https://developer.android.com/jetpack/compose

典型的喷气背包组合结构是:单个活动,多个可组合,通过喷气背包导航粘合在一起。注意,不再需要碎片了。

有关示例,请参见Android中的Now。

为什么我在所有情况下都喜欢片段而不是活动。

活动费用高昂。在Fragment中,视图和属性状态是分开的——每当片段处于后台时,其视图都将被销毁。因此,您可以堆叠比“活动”多得多的碎片。回钉操作。使用FragmentManager,可以很容易地清除所有碎片,插入更多的碎片等。但对于Activity来说,操纵这些东西将是一场噩梦。可预测的生命周期。只要不回收主机“活动”。背景中的碎片不会被回收。因此,可以使用FragmentManager::getFragments()查找特定的Fragment(不鼓励)。

不要忘记,活动是应用程序的块/组件,可以通过Intent共享和启动!因此,应用程序中的每个活动只能解决一种任务。如果您的应用程序中只有一个任务,那么我认为您只需要一个活动和多个片段(如果需要)。当然,您可以在解决其他任务的未来活动中重用片段。这种方法将明确和合乎逻辑地分离任务。您不需要为不同的片段集维护一个具有不同意图过滤器参数的活动。您可以根据需求在开发过程的设计阶段定义任务。

在我看来,这并不重要。要考虑的关键因素是

你多久会重复使用一部分UI(例如菜单),该应用程序也适用于平板电脑吗?

碎片的主要用途是构建多路径活动,这使得它非常适合Tablet/Phone响应应用程序。