当前位置: 首页 > 知识库问答 >
问题:

什么时候使用片段反栈与单个活动?

颛孙飞鸾
2023-03-14

我已经为Android开发了几年了,我仍然发现自己在这个问题上反复思考:什么时候我应该使用backstack中的片段,还是将每个片段放入自己的活动中?

在Android片段文档中,他们展示了如下图:

我完全理解tablet用例,但对于手机用例,我不明白为什么要将每个片段放入自己的活动中。我通常创建一个活动并将片段添加到backstack(通过FragmentManager)。这两种方法中的任何一种是否被认为是“正确的”方法?如果两者都是好的,那么有什么好的经验法则可以用来选择使用哪种方法呢?

这个问题关系密切,但我对此并不完全满意。如果您应该使用单独的活动,那么首先使用片段的后栈有什么意义呢?

共有1个答案

倪德业
2023-03-14

我怀疑有没有正确的方法做这件事。在某些情况下,可能有一些方法比其他方法更好,但大多数情况下,答案是“视情况而定”。

在使用Eclipse的SDK的最新版本(22.x)中,我注意到生成的每个活动只不过是一个片段的占位符。片断是自动生成的,包含视图逻辑。似乎他们想让活动仅仅是片段的占位符/控制器。我想我不同意这一点。虽然我确实看到了平板电脑的用例,但我觉得这种模式应该更多地根据需要而不是作为一般规则来使用。这只是我的观点,但我认为将所有的逻辑移到片段中会牺牲您从使用某个活动中获得的一些好处,因此只有当您需要专门重用那个片段时,它才是一个有用的模式。

如果您应该使用单独的活动,那么首先使用片段的后栈有什么意义呢?

好问题。我个人更喜欢使用许多活动,并且只在需要在多个地方重用逻辑/视图的地方使用片段。我认为使用startactivitystartactivityforresult并允许系统管理您的活动堆栈的流程只是比试图管理一个巨大的碎片后堆栈和一个活动(同样,只是我的意见)简单一点。

那么我什么时候才会使用碎片后堆栈呢?最近我用它的时候其实有一个很好的情况。我有一个活动需要构建一个非常复杂的对象。对象需要向用户输入许多字段,因此我创建了一个工作流,让用户一步一步地完成这个过程。我创建了一个单独的活动来处理这个逻辑的创建。UI的每一步都是一个片段,它从用户获取输入,向活动报告,然后活动加载下一个片段。这些片段被添加到后面的堆栈中,这样用户就可以返回到工作流中的前面步骤。

Object1CreationActivity

FragmentA --> FragmentB --> FragmentC --> FragmentD

片段和活动之间的通信应该通过接口来完成。如果我们想在其他任何地方重新使用这些,这是很重要的。正因为如此,我可以重用这些代码的大部分来创建另一个对象。

Object2CreationActivity

FragmentB --> FragmentD --> FragmentE

总结一下,片段、活动、后面的堆栈,这些都是你可以用来制作Android应用程序的强大工具。对于何时以及如何使用它们,可能没有很好的经验法则,但只要您深谙它们如何协同工作,就可以根据您的应用程序使用它们。

 类似资料:
  • 我一直对此感到沮丧,也找不到好的答案,所以希望这里有人能提供指导。 我有一个片段相当广泛地使用了。片段调用(返回null)时,我经常受到错误的困扰。我假设发生这些情况是因为在附加活动之前或分离活动之后调用了片段中的某些方法。 在我的代码中处理这个问题的正确方法是什么?我不想让这个成语到处乱扔, 一些人建议在暂停时取消任务,但这意味着标准习惯用语, 无法使用。这意味着每个执行的都需要跟踪到完成或取消

  • 我一直对此感到沮丧,我找不到一个好的答案,所以希望这里有人能提供指导。 我有一个片段非常广泛地使用了。我经常被bug困扰,其中片段调用,返回null。我假设发生这些情况是因为在附加活动之前或分离活动之后调用了片段中的某些方法。 在我的代码中处理这个问题的正确方法是什么?我不想把这个成语到处乱扔, 查看

  • 问题内容: 奇怪的是: 似乎或多或少被定义为。通过这种方式很容易产生错误: 一些fname意外地以else块结尾。修复很简单,我们应该改用它,但是从表面上看,这似乎是一种不错的pythonic方式,并且比“正确”的方式更具可读性。 由于字符串是不可变的,所以为什么字符串错误是什么技术细节?什么时候进行身份检查更好,什么时候进行平等检查更好? 问题答案: 据我所知,检查对象身份是否相等。由于没有强制

  • 我过去常常将用于后台任务,但后来发现建议使用,因为它们的寿命更长。 现在,在阅读时,我发现您可以在没有ui的情况下使用fragments来运行后台任务。

  • 问题内容: 我有一个将客户发送到另一个站点来处理付款的应用程序。客户之外的另一个站点在我们的服务器上调用一个页面,让我们知道付款的状态。被调用页面会检查付款应用程序提供的参数,并检查我们是否知道该交易。然后,它更新数据库以反映状态。这一切都无需与客户进行任何互动即可完成。 我个人选择将此功能实现为JSP,因为将文件拖放到文件系统中比编译和打包文件然后将条目添加到配置文件中要容易得多。 考虑到页面的

  • 问题内容: 在什么情况下,您将使用字段变量而不是局部变量?我发现很难决定何时在类中的2个或更多方法中使用变量。我倾向于使用局部变量,并将它们传递给另一种方法。 谢谢, 莎拉 问题答案: 用面向对象的术语来说,变量作为对象的属性有意义吗?如果是这样,则应将其设为字段变量。如果没有,它可以任意选择。 记住单一责任原则-设计良好的班级应该只承担1个责任,因此只有1个改变的理由。