为什么片段,何时使用片段而不是活动?

时间:2012-05-07 07:23:37

标签: android android-layout android-fragments android-activity android-3.0-honeycomb

在Android API 11+中,Google发布了一个名为Fragment的新类。

在视频中,Google建议尽可能(link1link2),我们应该使用片段而不是活动,但他们没有解释原因。

片段的目的是什么?它们的一些可能的用途(除了一些可以通过简单的视图/布局轻松实现的UI示例)?

我的问题是片段:

  1. 使用片段的目的是什么?
  2. 与使用活动/视图/布局相比,使用片段有哪些优缺点?
  3. 奖金问题:

    1. 你能为片段提供一些非常有趣的用途吗?谷歌在他们的视频中没有提到的事情?
    2. 片段与包含片段的活动之间进行通信的最佳方式是什么?
    3. 使用碎片时要记住哪些最重要的事情?您的经验提示和警告吗?

12 个答案:

答案 0 :(得分:258)

  

#1& #2使用片段和目的的目的是什么?什么是   与使用相比,使用碎片的优点和缺点   活动/视图/布局?

片段是Android创建可重用用户界面的解决方案。您可以使用活动和布局(例如使用包含)来实现某些相同的功能。然而;片段从HoneyComb连接到Android API。让我详细说明一下;

  • ActionBar。如果您希望使用标签导航您的应用,您会很快看到ActionBar.TabListener界面为FragmentTransaction方法提供onTabSelected作为输入参数。你可能会忽略这一点,做一些别的和聪明的事情,但你会反对API而不是它。

  • FragmentManager以非常聪明的方式为你处理«返回»。返回并不意味着回到最后一个活动,就像常规活动一样。这意味着回到之前的片段状态。

  • 您可以将酷ViewPagerFragmentPagerAdapter一起使用来创建滑动界面。 FragmentPagerAdapter代码比常规适配器更清晰,并且它控制各个片段的实例化。

  • 如果在尝试为手机和平板电脑创建应用程序时使用Fragments,您的生活将会轻松多了。由于片段与Honeycomb + API紧密相关,因此您还需要在手机上使用它们以重用代码。这就是兼容性库派上用场的地方。

  • 您甚至可以而且应该将片段用于仅适用于手机的应用。如果你有可携带性。我使用ActionBarSherlock和兼容性库来创建“ICS外观”应用程序,这些应用程序在返回1.6版本时看起来一样。您可以获得ActionBar等最新功能,包括标签,溢出,拆分操作栏,查看戳等。

  

奖金2

片段之间进行通信的最佳方式是意图。当您在片段中按某些内容时,通常会使用其中的数据调用StartActivity()。意图将传递给您启动的活动的所有片段。

答案 1 :(得分:67)

不确定您指的是哪些视频,但我怀疑他们是说您应该使用片段而不是活动,因为它们不能直接互换。在开发指南中实际上有一个相当detailed entry,考虑阅读它以获取详细信息。

简而言之,片段存在于活动内部,每个活动都可以容纳许多片段。与活动一样,它们具有特定的生命周期,与活动不同,它们不是顶级应用程序组件。片段的优点包括代码重用和模块化(例如,在许多活动中使用相同的列表视图),包括构建多窗格界面的能力(主要用于平板电脑)。主要缺点是(某些)增加了复杂性。通常,您可以使用非标准且不太稳健的方式使用(自定义)视图实现相同的功能。

答案 2 :(得分:44)

片段是应用程序的一部分用户界面或行为,可以放在一个Activity中,从而实现更模块化的活动设计。如果我们说片段是一种子活动就没有错。

以下是关于片段的重要观点:

  1. 片段有自己的布局和自己的行为以及自己的生命周期回调。

  2. 您可以在活动运行时添加或删除活动中的片段。

  3. 您可以在单个活动中组合多个片段以构建多窗格UI。

  4. 片段可用于多种活动。

  5. 片段生命周期与其宿主活动的生命周期密切相关。

  6. 当活动暂停时,活动中可用的所有片段也将停止。

  7. 片段可以实现没有用户界面组件的行为。

  8. 使用API​​版本11将片段添加到Android 3(Honeycomb)的Android API中。

  9. 有关详细信息,请访问官方网站 Fragments

答案 3 :(得分:16)

这是我在片段上发现的重要信息:

  

历史上,Android应用中的每个屏幕都是作为单独的Activity实现的。这在屏幕之间传递信息时产生了挑战,因为Android Intent机制不允许在活动之间直接传递引用类型(即对象)。相反,必须序列化对象或提供全局可访问的引用。

     

通过使每个屏幕成为一个单独的片段,这个数据通过头痛   完全避免了。片段总是存在于a的上下文中   给定Activity并始终可以访问该Activity。通过存储   活动中感兴趣的信息,每个片段的片段   屏幕可以通过Activity轻松访问对象引用。

来源:https://www.pluralsight.com/blog/software-development/android-fragments

答案 4 :(得分:7)

片段在某些情况下特别有用,比如我们想在所有页面中保留导航抽屉。您可以使用您想要的任何片段来扩充框架布局,并且仍然可以访问导航抽屉。

如果您使用过某项活动,则必须将抽屉保留在所有可能导致冗余代码的活动中。这是片段的一个有趣用途。

我是Android新手,仍然认为片段有用这样。

答案 5 :(得分:4)

我知道这已经讨论过死亡,但我想补充一点:

  • Frags可用于填充Menu并可自行处理MenuItem次点击。从而为您的活动提供更多调制选项。你可以在没有你的活动知道的情况下做ContextualActionBar等等,并且基本上可以将它与你的Activity处理的基本内容(导航/设置/关于)分开。

  • 带有子Frags的父Frag可以为您提供模块化组件的更多选项。例如。你可以轻松地交换Frags,将新的Frags放入寻呼机或移除它们,重新排列它们。所有没有你的活动知道它只关注更高级别的东西。

答案 6 :(得分:1)

活动是应用程序中带有工具栏的全屏组件,其他所有内容最好都是片段。 具有工具栏的一个全屏父级活动可以具有多个窗格,可滚动页面,对话框等(所有片段),所有这些都可以从父级访问并通过父级进行通信。

示例:

活动A,活动B,活动C:

  • 所有活动都需要重复相同的代码,以显示基本内容 例如工具栏,或从父活动继承(成为 麻烦管理)。
  • 要从一项活动转移到另一项活动,要么全部都需要保存在内存中(开销),要么必须销毁其中一项才能打开另一项活动。
  • 活动之间的交流可以通过意图进行。

vs

活动A,片段1,片段2,片段3:

  • 没有重复代码,该活动的所有屏幕都有工具栏等。
  • 从一个片段移到下一个片段的几种方法-查看寻呼机,多窗格等。
  • 活动拥有最多的数据,因此需要最少的片段间通信。如果仍然需要,可以通过界面轻松完成。
  • 片段不需要全屏显示,设计时具有很大的灵活性。
  • 如果不需要视图,则片段不需要夸大布局。
  • 几个活动可以使用相同的片段。

答案 7 :(得分:0)

片段存在于活动中。

虽然活动依然存在。

答案 8 :(得分:0)

碎片存在于活动中并具有:

  • 自己的生命周期
  • 自己的布局
  • 自己的孩子碎片等。

将Fragments视为它所属的主要活动的子活动,它不能自己存在,可以一次又一次地调用/重用。希望这有帮助:)

答案 9 :(得分:0)

1.使用片段的目的?

  • 答:
    1. 处理设备形状因素差异。
    2. 在应用屏幕之间传递信息。
    3. 用户界面组织。
    4. 高级用户界面隐喻。

答案 10 :(得分:0)

在上述答案的基础上,我将使用在Playstore上发布的应用示例来说明这一点。

这是我在那里学习android时开发的第一款应用程序 我认为有12个活动页面。其中大多数页面具有可以在其他页面中重复使用的内容,但最终,对于该应用程序的每一次单击,我最终都有一个单独的活动页面。 一旦学习了片段,我就意识到如何可以实现所有可重用的功能并将它们分开,并且仅用于很少的活动。 我的用户可能看不到任何区别,但是除了片段重量轻之外,除了提供的可重用性和模块化之外,用更少的代码也可以实现相同的目的。

答案 11 :(得分:0)

Fragment 可以被认为是 ui 元素的复合树中的非根组件,而活动位于复合树(ui 树)的顶部。

  • 关于何时使用 Fragment 的经验法则是当片段作为子片段具有冲突属性时,例如,它可能是沉浸式的,或者可能正在使用完全不同的风格,或者有一些其他的架构/逻辑差异,并且不适合同质的现有树。

  • 关于何时更喜欢 Activity 而不是 Fragment 的经验法则是,当任务(或一组连贯的任务)完全独立且可重复使用,并进行一些举重工作,并且不应需要进一步遵守另一个父子组合(违反 SRP,第二个责任是遵守组合)。例如,MediaCaptureActivity 可以捕获音频、视频、照片等,并允许编辑、去除噪音、照片注释等。此活动/模块可能具有执行更精细工作并符合通用显示主题的子片段。