我知道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)所说,正如我所认识到的那样,使用尽可能少的活动的哲学并不适用于所有情况,因为它在他所谓的“上帝”活动中造成了混乱。


当前回答

几乎总是使用碎片。如果你知道你正在构建的应用程序仍然很小,那么使用碎片所付出的额外努力可能不值得,因此可以忽略它们。对于更大的应用程序,引入的复杂性被提供的灵活性所抵消,从而更容易证明在项目中使用它们是合理的。有些人非常反对碎片及其生命周期带来的额外复杂性,因此他们从不在项目中使用它们。这种方法的一个问题是,Android中有几个API依赖于片段,例如ViewPager和Jetpack导航库。如果你需要在应用程序中使用这些选项,那么你必须使用片段来获得它们的好处。

节选自:克里斯汀·马西卡诺。《Android编程:大Nerd牧场指南》,第4版,苹果图书。

其他回答

好吧,根据谷歌的讲座(也许在这里,我不记得了),你应该考虑尽可能使用碎片,因为它使你的代码更容易维护和控制。

然而,我认为在某些情况下,它可能变得过于复杂,因为承载片段的活动需要在它们之间导航/通信。

我认为你应该自己决定什么最适合你。将活动转换为片段通常并不难,反之亦然。

如果你想进一步阅读,我已经在这里创建了一篇关于这个dillema的帖子。

几乎总是使用碎片。如果你知道你正在构建的应用程序仍然很小,那么使用碎片所付出的额外努力可能不值得,因此可以忽略它们。对于更大的应用程序,引入的复杂性被提供的灵活性所抵消,从而更容易证明在项目中使用它们是合理的。有些人非常反对碎片及其生命周期带来的额外复杂性,因此他们从不在项目中使用它们。这种方法的一个问题是,Android中有几个API依赖于片段,例如ViewPager和Jetpack导航库。如果你需要在应用程序中使用这些选项,那么你必须使用片段来获得它们的好处。

节选自:克里斯汀·马西卡诺。《Android编程:大Nerd牧场指南》,第4版,苹果图书。

我的哲学是:

只有在绝对需要时才创建活动。由于后端堆栈可用于提交一堆碎片事务,我尝试在应用程序中创建尽可能少的活动。此外,不同片段之间的通信比在活动之间来回发送数据要容易得多。

活动转换很昂贵,对吧?至少我这么认为——因为旧活动必须被销毁/暂停/停止,推到堆栈上,然后新活动必须被创建/启动/恢复。

自从引入片段以来,这就是我的哲学。

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

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

片段相对于活动的一大优势是,用于片段的代码可以用于不同的活动。因此,它提供了应用程序开发中代码的可重用性。