困境:何时使用碎片与活动:

Emi*_*Adz 761 architecture android android-fragments android-activity

我知道它Activities的目的是代表我的应用程序的单个屏幕,同时Fragments设计为可重用的UI布局,其中嵌入了逻辑.

直到不久前,我开发了一个应用程序,因为它说应该开发它们.我创建了一个Activity代表我的应用程序的屏幕并使用Fragments for ViewPagerGoogle Maps.我很少创建ListFragment可以多次重用的UI或其他UI.

最近我偶然发现一个项目只包含2 Activities个是一个SettingsActivity而另一个是MainActivity.它的布局中MainActivity填充了许多隐藏的全屏UI片段,只显示了一个.在Activity逻辑FragmentTransitions中,应用程序的不同屏幕之间存在许多.

我喜欢这种方法的原因是因为应用程序使用了一个ActionBar,它保持原样并且不会随着屏幕切换动画一起移动,这就是Activity切换时发生的情况.这为这些屏幕转换提供了更流畅的感觉.

所以我想我要问的是分享你关于这个主题的当前开发方式,我知道它看起来可能看起来像一个基于意见的问题,但我把它视为一个Android设计和架构问题...不是真的基于意见的一个.

更新(01.05.2014):继来自SquareEric Burke的演示之后(我不得不说这是一个很棒的演示文稿,为Android开发人员提供了许多有用的工具.而且我与Square没有任何关系)

http://www.infoq.com/presentations/Android-Design/

根据我过去几个月的个人经验,我发现构建应用程序的最佳方法是创建一组片段,这些片段代表应用程序中的并将所有这些片段集中在一个片段中Activity.所以基本上你Activities的应用程序的数量与流量的数量相同.这样,操作栏在所有流程的屏幕上保持完整,但正在重新创建流程,这很有意义.正如埃里克伯克所说,并且我也已经意识到,尽可能少Activities地使用的哲学并不适用于所有情况,因为它在他所谓的"上帝"活动中造成混乱.

san*_*one 263

专家会告诉你:"当我看到用户界面时,我会知道是否要使用Activity或者Fragment".在一开始这没有任何意义,但是到时候,你实际上能够分辨出你是否需要Fragment.

有一种很好的做法,我发现对我很有帮助.当我试图向女儿解释一些事情时,我突然想到了.

即,想象一个代表屏幕的框.你可以在这个盒子里加载另一个屏幕吗?如果您使用新的盒子,是否需要从第一个盒子中复制多个项目?如果答案是肯定的,那么您应该使用Fragments,因为根Activity可以容纳所有重复的元素以节省您创建它们的时间,并且您可以简单地替换框的部分.

不要忘记,你总是需要一个盒子容器(Activity)或你的零件将被分散.所以一个盒子内有零件.

小心不要误用盒子.Android UX专家建议(你可以在YouTube上找到它们)我们应该明确加载另一个Activity,而不是使用a Fragment(就像我们处理具有类别的导航抽屉时).一旦您感到满意Fragments,您就可以观看他们的所有视频.更多它们是强制性材料.

你现在可以看看你的UI并弄清楚你是否需要一个Activity或一个Fragment?你有新观点吗?我想你做到了.

  • 你有提到的youtube feed的链接吗?我搜索"Android UX专家"和"Android UX",但我不完全确定您正在谈论哪些视频. (4认同)
  • 不再是,一年多前看了它.搜索关于用户体验的Android开发者官方 (2认同)

VJ *_*ons 122

我的理念是这样的:

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

活动过渡很昂贵,对吧?至少我是这么认为的 - 因为旧活动必须被销毁/暂停/停止,被推入堆栈,然后必须创建/启动/恢复新活动.

这是我的哲学,因为片段被引入.

  • 我不相信各种片段之间的通信更容易,而不是在活动之间来回发送数据. (28认同)
  • 至少,`onActivityResult()`比片段'回调更安全,更容易. (3认同)
  • 是的,但是正如您所写的,有时需要使用活动。一个示例是相机屏幕,最好在横向模式下使用它。另一个示例是在您放置自定义的appWidget(在“桌面”-启动器应用程序上)时显示的配置屏幕。 (2认同)
  • 那么如何解决fragments需要互相传递“状态”的问题呢?所有片段中的所有状态都需要存在于一个活动中,否则您将被迫使用单例。 (2认同)

and*_*per 58

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

但是,我认为在某些情况下它会变得太复杂,因为托管片段的活动需要在它们之间导航/通信.

我想你应该自己决定什么对你最好.将活动转换为片段通常并不难,反之亦然.

我创建了一个关于这个dillema后在这里,如果你想进一步阅读一些.

  • 感谢您的回答并分享您的经验所以您认为在Android中将应用程序限制为一个Activity并在应用程序架构允许的情况下将Fragment用于所有屏幕是一个很好的做法? (5认同)

Qyl*_*lin 27

为什么我喜欢碎片而不是所有情况下的活动.

  • 活动很昂贵.在Fragment中,视图和属性状态是分开的 - 每当片段进入时backstack,其视图将被销毁.因此,您可以堆叠比活动更多的碎片.

  • Backstack操纵.有了FragmentManager,很容易清除所有碎片,插入比碎片等更多.但对于Activity来说,操纵这些东西将是一场噩梦.

  • 一个可预测的生命周期.只要主机Activity不被回收.背板中的碎片不会被回收.因此可以用来FragmentManager::getFragments()查找特定的片段(不鼓励).


Fra*_*cis 16

Jetpack开始单一活动应用程序是首选的体系结构。尤其对导航体系结构组件有用。

资源

  • 我今天第一次读到 Jetpack。:) 自从引入片段以来,我们构建了单个活动应用程序。多活动要复杂得多。 (2认同)

小智 12

在我看来,这并不是真的相关.要考虑的关键因素是

  1. 您多久会重复使用部分UI(例如菜单),
  2. 是平板电脑的应用程序?

片段的主要用途是构建多窗格活动,这使其成为平板电脑/手机响应式应用的理想选择.


gue*_*est 9

不要忘记一个活动是应用程序的块/组件,可以通过Intent共享和启动!因此,应用程序中的每个活动都应该只解决一种任务.如果您的应用程序中只有一个任务,那么我认为您只需要一个活动和许多片段.当然,您可以在将来的活动中重用碎片来解决其他任务.这种方法将明确和逻辑分离任务.并且您不需要为不同的片段集维护具有不同意图过滤器参数的一个活动.您可以根据需求在开发过程的设计阶段定义任务.


The*_*mer 8

除此之外,还有更多内容,你必须记住,发起的活动不会隐含地破坏调用活动.当然,您可以进行设置,以便用户单击按钮转到页面,启动该页面的活动并销毁当前页面.这会导致很多开销.我能给你的最佳指南是:

**只有在主要活动和同一个活动同时打开时才开始新的活动(想想多个窗口).

Google云端硬盘是一个很好的例子,说明何时进行多项活动是有意义的.主要活动提供了一个文件浏览器.打开文件时,将启动一个新活动以查看该文件.您可以按最近的应用程序按钮,这将允许您返回浏览器而不关闭打开的文档,然后甚至可能打开与第一个文档并行的另一个文档.


小智 7

我做了:尽可能使用更少的片段.不幸的是,几乎可以.所以,我最终得到了很多片段和一些活动.我意识到的一些缺点:

  • ActionBar&菜单:当2个片段有不同的标题,菜单时,
    很难处理.例如:添加新片段时,您可以更改操作栏标题,但从弹出它时backstack无法恢复旧标题.在这种情况下,您可能需要在每个片段中使用工具栏,但请相信我,这将花费您更多时间.
  • 当我们需要时startForResult,活动有,但片段没有.
  • 默认情况下没有过渡动画

我的解决方案是使用Activity 片段包装在里面.所以我们有单独的动作栏,菜单startActivityForResult,动画......

  • 非常有用的点,谢谢。你能澄清“*一个包装片段的活动*”吗?您是否为每个片段制作了单独的 Activity?如果是这样,您是否需要 Fragment? (3认同)
  • 有一种还原标题和内容的方法。使用`getSupportFragmentManager()。addOnBackStackChangedListener`添加一个侦听器。在该侦听器中获取当前片段,然后设置标题和内容。 (2认同)

小智 6

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

  • 如何?你能提供一些例子吗? (3认同)

小智 5

每个应用程序使用一个活动来为屏幕 fragment 使用提供基础,与 片段相比重量轻,重复使用的 片段更适合支持手机和平板电脑的应用程序fragmentfragmentsactivites