何时使用片段回退栈而不是单独的活动?

3

我已经开发安卓应用有几年了,但我仍在思考一个问题:何时应该将片段放入后台堆栈中,而不是将每个片段放入其自己的活动中?

安卓片段文档中,他们展示了这个图表:

我完全理解平板电脑使用情况,但对于手机使用情况,我不明白为什么要将每个片段放入其自己的活动中。我通常创建一个活动并将片段添加到后台堆栈中(通过FragmentManager)。这两种方法中是否有一种被认为是“正确”的方法?如果两种方法都可以,请问如何选择哪种方法的好方法?

这个问题与此密切相关,但我对它并不完全满意。如果应该使用单独的活动,那么首先拥有片段后台堆栈的意义何在?

2个回答

3
我怀疑没有正确的方法来做这件事。在某些情况下,可能有一些比其他方法更好的方法,但基本上,答案是“取决于情况”。
我注意到在Eclipse的SDK最新版本(22.x)中生成的每个Activity都只是Fragment的占位符。Fragment是自动生成的,并包含视图逻辑。看起来他们想让活动成为片段的占位符/控制器。尽管我确实看到了平板电脑的用例,但我认为这种模式应该更多地根据需要使用,而不是作为一般规则。这只是我的观点,但我认为将所有逻辑移到片段中会牺牲使用活动时获得的一些好处,因此只有在需要特定重用该片段时才是有用的模式。
“如果你应该使用单独的活动,那么首先使用片段回退栈的意义是什么?”好问题。我个人更喜欢使用许多活动,并仅在需要在多个位置重用逻辑/视图时才使用片段。我认为使用startActivitystartActivityForResult的流程,并允许系统管理您的活动堆栈,比尝试管理巨大的片段后堆栈和一个活动要容易一些(仅是我的意见)。
那么我什么时候才会使用片段回退栈呢?最近,我有一个非常好的情况要使用它。我有一个需要构建非常复杂对象的活动。对象需要用户输入许多字段,因此我创建了一个工作流程,逐步引导用户完成此过程。我创建了一个单一的活动来处理此逻辑的创建。UI的每个步骤都是一个片段,从用户那里获取输入,向活动报告,然后活动加载下一个片段。片段添加到回退堆栈中,以便用户可以返回到工作流程的先前步骤。 Object1CreationActivity
FragmentA --> FragmentB --> FragmentC --> FragmentD

Fragment和Activity之间的通信应该使用接口进行。如果我们想在其他地方重用它们,这一点非常重要。因此,我可以重用大部分代码来创建另一个对象。

Object2CreationActivity

FragmentB --> FragmentD --> FragmentE

总的来说,片段、活动、返回栈都是您可以用来制作Android应用程序的强大工具。并没有一个很好的经验法则说什么时候以及如何使用它们,但只要您熟悉它们如何协同工作,就可以根据您的应用程序适当地使用它们。


关于startActivity/startActivityForResult的好处很好。如果您正在使用“ Activity作为Fragments控制器”方法,仍然可以使用它们,不是吗? - Ryan J. Thompson
片段可以调用 startActivitystartActivityForResult,因此您可以完全将它们与片段一起使用(请注意,子片段与startActivityForResult无法正常工作)。 - jacobhyphenated

0

片段是活动的轻量级替代品......这是一种看待它的方式。例如,我有一个包含大约10-13个屏幕的应用程序。要么

  • 我为每个屏幕创建一个新的活动。或者
  • 我只创建几个在功能方面逻辑上不同的活动,并在其中交换视图屏幕。或者
  • 我创建1个活动并将实际屏幕功能委托给片段。

我发现第三种方法更好、更易于管理。这有点像说片段允许使用framelayout选项重复使用视图。此外,您可以设计一种简单的方法,在片段之间共享数据,而不是使用Parceable在活动之间共享东西的重量级方式。

此外,Android API人员将更加关注基于片段的设计,而不是活动,因此最好遵循标准。使用片段比使用活动稍微复杂一些,但学习它们的努力是值得的。在我看来,它有助于创建可扩展和非常可重用的屏幕视图。


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