简介:
基本的“片段教程”模式是这样的:
-
在平板电脑上,左侧有一个列表,右侧是详细信息 .
-
两者都是
Fragments
并且都位于相同的Activity
中 . -
在手机上,列表
Fragment
在一个Activity
中 . -
使用详细信息
Fragment
启动新的Activity
.
(例如Android 3.0 Fragments API by Dianne Hackborn和Fragments API Guide)
在两个设备上,功能都在 Fragments
中 . (简单)
在 Tablet 上,整个应用程序是 1 Activity ,在 phone 上,有 many Activities .
问题:
- Is there a reason to split the phone app into many Activities?
此方法的一个问题是,您复制了主Tablet Activity
中的大量逻辑,以及单独的Phone Activities
中 .
- Would it not be easier to retain the 1 Activity model in both cases, using the same logic of switching Fragments in and out (just using a different layout)?
这样,大多数逻辑都驻留在 Fragments
本身,并且只有一个 Activity
- 更少的代码重复 .
我所读到的关于 ActionBarSherlock
的内容是它似乎最好用 Fragments
而不是 Activities
(但我还没有使用它) .
Are the tutorials oversimplified, or have I missed something major in this approach?
我们已经在办公室成功地尝试了这两种方法 - 但我即将开始一个更大的项目,并希望尽可能让事情变得简单 .
一些相关问题的链接:
-
Patterns when to use Activity Transition vs Dynamic Fragments
-
Android - I need some clarifications of fragments vs activities and views
-
So what are the exact advantages of Fragments in Android 3.0?
更新
开始提出赏金问题 - 仍然不相信我为什么需要在平板电脑活动和每个电话活动中复制我的应用逻辑 .
广场上的人们也发现了一篇有趣的文章,值得一读:
5 回答
我认为你走在正确的轨道上 . (是的,教程过于简化) .
在平板电脑布局中,您可以使用单个活动并交换进出碎片(在多个“窗格”中) . 在手机布局中,您可以为每个片段使用新的活动 .
像这样:
这似乎是一项额外的工作,但通过为手机使用多个活动,您可以启用基本的Activity生命周期和Intent传递 . 这也允许框架处理所有动画和后端堆栈 .
为了帮助减少代码,您可以使用
BaseActivity
并从中进行扩展 .因此,如果用户有平板电脑,您可以使用
MyMultiPaneFragActivity
或类似的东西 . 此活动负责管理来自片段的回调并将意图路由到正确的片段(例如搜索意图)如果用户有手机,您可以使用非常少的代码的常规活动,并将其扩展
MyBaseSingleFragActivity
或类似的东西 . 这些活动可能非常简单,5到10行代码(可能更少) .棘手的部分是路由意图和诸如此类的东西 . *(编辑:见下文) .
我认为这是推荐方法的原因是节省内存并降低复杂性和耦合 . 如果要交换Fragments,
FragmentManager
会为后端堆栈维护对该Fragment的引用 . 它还简化了用户应该'running'的内容 . 此设置还将Fragment中的视图,布局和逻辑与Activity生命周期分离 . 这样,片段可以存在于单个活动中,与另一个片段(双窗格)一起存在,或者存在于三窗格活动中,等等 .*具有常规意图路由的一个好处是,您可以从后端堆栈中的任何位置显式启动Activity . 一个例子可能是搜索结果 . (MySearchResults.class) .
在这里阅读更多:
http://android-developers.blogspot.com/2011/09/preparing-for-handsets.html
以下是Reto Meier关于此问题的答案,取自this video的Udacity's Android Fundamentals course .
提到"Is there a reason to split the phone app into many Activities?"的第一个问题 - 是的 . 它简单地归结为可用空间,平板电脑为开发人员提供了更多空间,从而允许开发人员在一个屏幕上放置更多空间 . Android告诉我们Activities can provide a screen . 所以你可以在平板电脑上使用1个大屏幕做什么,这可能需要分散在手机的多个屏幕上,因为没有足够的空间容纳所有人片段 .
在主 - 细节模式中,有两个活动 . 一个在较大屏幕上显示两个片段,在较小屏幕上仅显示“主”片段 . 另一个在较小的屏幕上显示“细节”片段 .
您的详细信息逻辑应该绑定在详细信息片段中 . 因此,没有与活动之间的细节逻辑相关的代码重复 - 细节活动仅显示细节片段,可能传递来自
Intent
额外的数据 .ActionBarSherlock与片段的关系不再是本机操作栏,因为ActionBarSherlock纯粹是本机操作栏的后端 .
我同意这些教程非常简化 . 他们只是介绍
Fragments
但我不同意所建议的模式 .我也同意在多个活动中复制应用程序逻辑不是一个好主意(参见DRY Principle on wikipedia) .
我更喜欢
ActionBarSherlock
Fragments Demo app(download here和source code here)使用的模式 . 与问题中提到的教程最匹配的演示是应用程序中名为"Layout"的演示;或FragmentLayoutSupport
在源代码中 .在此演示中,逻辑已移出
Activity
并进入Fragment
.TitlesFragment
实际上包含更改片段的逻辑 . 这样,每个Activity都非常简单 . 要复制许多非常简单的活动,其中没有任何逻辑在活动中,这使得它非常简单 .通过将逻辑放入片段,有 no need to write the code more than once ;无论片段放入哪个活动,它都可用 . 这使它成为比基本教程建议的模式更强大的模式 .
ABS模式的另一个优点是,您最终不会得到包含大量逻辑的Tablet活动,这意味着您可以节省内存 . 教程模式可以在更复杂的应用程序中导致非常大的主要活动;因为它需要处理随时放入其中的所有片段的逻辑 .
总的来说,不要认为它被迫使用许多活动 . 可以认为它有机会将代码分成许多片段,并在使用它们时节省内存 .