何时使用活动转换与动态片段的模式

Posted

技术标签:

【中文标题】何时使用活动转换与动态片段的模式【英文标题】:Patterns when to use Activity Transition vs Dynamic Fragments 【发布时间】:2011-12-04 19:37:22 【问题描述】:

关于如何处理 android 活动与片段中的 UI 转换是否有任何模式?我目前正在研究一个在景观中最多有 3 列的 UI。 我希望用户界面从屏幕上的 1 列开始,然后在第二列中选择移动的内容,然后在平板电脑和手机的第三列中单击第二列中的某些内容,然后在第一列中淡出在手机上。 我想知道什么时候应该将其作为 Activity 转换执行,什么时候应该只使用带有显示视图的片段。据我所知,片段可以移动到其他活动,所以我的选择是使用静态列布局实现活动,然后将片段与它们一起转换,或者让一个活动与所有 3 列一起并让活动管理出现片段。这两种方法都可以工作,但我对这两种解决方案的优缺点感兴趣。

有两个问题与我的问题相似,但没有完全回答我的问题

Two panel UI with Fragments vs Separate activities Android Honeycomb: layout problem - hide/show FrameLayouts

【问题讨论】:

【参考方案1】:

Fragment 看起来像是更多的代码(因为您将视图放入片段中,并将片段放入 Activity 中,而不仅仅是 Activity 中的视图),但它们非常适合让您免于烦恼在这种情况下-绝对要使用 Fragments。他们甚至为您处理过渡。

我们有一些名为“Honeycomb Gallery”的示例代码,您可以查看here,它具有两列加操作栏布局,并且能够显示/隐藏最左侧的列。这应该可以让您在弄清楚如何为多个片段进行布局并显示/隐藏它们方面提供一个良好的开端。

仅供参考,在一个活动中使用多个片段而不是多个活动的一个重要权衡是片段不直接响应意图 - 例如,如果您有一个笔记应用程序,其中“查看笔记”页面是一个活动,你改变了它,以便在主活动中有一个“查看笔记”片段,然后你必须设置它,以便主活动接收一个笔记 ID 和一个笔记动作(创建、查看、编辑,无论如何)在意图中,而不是仅仅让“查看笔记”活动在意图中接收笔记ID。然后,主 Activity 需要相应地在页面上设置片段。没什么大不了的,但如果通过 Intent 对应用程序各个部分的外部可访问性很重要,那么将应用程序分解为几个 Activity 以及使用片段来表示各个组件可能会更容易。

【讨论】:

感谢 Alexander,这是一个很好的指导,我实际上已经忘记了那个示例应用程序。对我来说,关于 Activity 与 Fragments 的关系较少,更多的是关于何时使用一个包含静态 Fragments 的 Activity 以及何时动态加载 Fragments。我认为一个很好的模式是 Intent 机制。因此,如果您希望屏幕可通过 Intent 寻址,则将其放在它自己的 Activity 中。你能想到其他模式吗? Ice Cream Sandwich Core 应用程序中是否有可以用来研究如何最好地使用 Fragments 的良好模式? 在最近的 Honeycomb Android 开发实验室中,我们有一位开发人员说他们通过“gmail 会做什么”。虽然在您的应用程序中有效的功能始终是最重要的,但它们确实提出了一个很好的观点,即 gmail 应用程序(平板电脑和手机)在良好使用片段以及更新操作栏项目和可见片段方面是一个非常可靠的参考基于上下文(即,操作栏项会根据您是在阅读电子邮件、编写电子邮件还是浏览电子邮件列表而变化。)在 Honeycomb、Youtube 和联系人中,也很棒。根据 ICS,我还不能谈论细节 :) 感谢亚历山大的精彩更新。我期待着 ICS Open Source Drop 来看看代码。我知道很多 Google Apps 并未包含在内,但我相信开源树中仍有足够多的核心应用可以学到很多东西。【参考方案2】:

基于页面The Android 3.0 Fragments API,一个活动是独立的,而一个片段可以被认为是一个迷你活动,它必须托管在一个实际的活动中。

接着说,Fragment API 的引入使 Android 开发人员有机会解决开发人员在使用活动时遇到的许多痛点,因此在 Android 3.0 中,Fragment 的实用性远远超出了仅针对不同屏幕进行调整的范围:

我认为在应用中使用单个 Activity 不一定是错误的决定,只是风格问题。这是您应该根据您要完成的任务做出的决定。

但是,人们认为 Fragments 的引入是为了解决现实世界的问题。仅基于此,我建议您编写一些“概念证明”代码并评估结果。目前,这可能是唯一重要的现实世界测试

【讨论】:

感谢诺亚的评论,我同意你的说法,不幸的是它没有回答我的问题,因为我正在寻找模式。但似乎我们都在用 Fragments 开辟新天地。【参考方案3】:

使用全屏活动

将片段用于部分或不使用屏幕(但不是服务)

在我的主应用程序中,我希望在应用程序的多个部分中保留水平滚动视图中的屏幕选项卡。部分包括 新闻、照片、视频、日程安排等。所有单用户可聚焦的任务。

包含所有内容的主应用程序是一个应用程序,选项卡只是一个调用片段管理器的视图。

但是,我将活动用于应用程序更深层次的复杂用户活动。例如。如果有人播放视频、查看项目详细信息页面和照片库/幻灯片部分,因为它们都是全屏组件。

在切换到全屏时无需显示/隐藏片段,因为活动堆栈可以快速轻松地处理您想要执行的所有操作,并保持您的代码简洁明了。

所以我有 Activity -> 房屋碎片 -> 为特殊命令启动全屏活动。

【讨论】:

感谢您的回答 HaMMeReD 我已经知道很多了 :-) 问题更多的是针对何时在活动之间转换以更改屏幕以及何时仅更改动态片段。 每次活动都是全屏组件时使用。您可以在多个活动中重复使用片段。 实际上,手机上的全屏组件是平板电脑上的部分屏幕组件,因此将“全屏”位放入片段而不是活动中仍然有意义。跨度> 我想指出,API 不支持 Fragments 中的 Fragments,它们会导致崩溃。因此,如果您打算在其中使用 Fragments,我仍然不鼓励将 Fragments 用于全屏应用程序。 确实每个活动都应该由片段填充。你永远不应该有一个带有 UI 控件的活动,只有一个带有片段的活动。如果是全屏活动,它应该包含一个片段。

以上是关于何时使用活动转换与动态片段的模式的主要内容,如果未能解决你的问题,请参考以下文章

活动/片段转换是不是与棒棒糖之前的设备兼容?

何时片段不附加到活动而仅附加到上下文?

在单个活动中动态实现多个片段

如何将活动转换为片段以在抽屉中使用

单例片段或保存网页视图状态

视图之间的共享元素转换(不是活动或片段)