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

and*_*per 451 android android-layout android-fragments android-3.0-honeycomb android-activity

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

在视频中,谷歌建议尽可能(link1,link2),我们应该使用片段而不是活动,但他们没有解释确切原因.

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

我的问题是片段:

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

奖金问题:

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

Gle*_*ech 267

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

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

  • ActionBar.如果您希望选项卡在那里导航您的应用程序,您很快就会看到该ActionBar.TabListener界面为您提供了FragmentTransactiononTabSelected方法的输入参数.你可能会忽略这一点,做一些别的和聪明的事情,但是你会反对API而不是它.

  • FragmentManager手柄«返回»在一个非常聪明的方式为您服务.返回并不意味着回到最后一个活动,就像常规活动一样.这意味着回到之前的片段状态.

  • 您可以使用cool ViewPagerwith a FragmentPagerAdapter来创建滑动界面.该FragmentPagerAdapter代码是比普通的适配器更清洁,它控制各个片段的实例.

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

  • 您甚至可以而且应该将片段用于仅适用于手机的应用程序.如果你有可携带性.我使用ActionBarSherlock和兼容库来创建"ICS外观"应用程序,看起来一直回到1.6版本.您可以获得最新功能,如ActionBar标签,溢出,分割操作栏,viewpager等.

奖金2

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

  • 一个片段不应该直接与另一个片段对话 - 而是通过父活动.这样您就不会得到意大利面条代码,但易于管理代码. (52认同)
  • Re *“在片段之间进行通信的最佳方式是意图”* 嗯?我不这么认为。意图用于*活动*之间的通信。“在片段之间”进行通信的方式是..不要。也就是说,不要直接进行片段到片段的通信,而是片段应该在自定义接口中对其拥有的活动进行回调,这决定了要做什么。 (8认同)
  • 首先,谢谢.我欣赏那些提供信息性(但简短)答案的人,而不仅仅是给我一个手册的链接.除了额外的特殊课程功能之外,你能想到使用片段的优点和缺点吗? ? (4认同)
  • 我认为你必须更直接地提问.我刚刚给出了上述四大优势. (3认同)
  • 好吧,与自定义视图和活动相比,缺点是什么? (2认同)
  • 你如何使用意图在片段之间进行通信?所有片段都需要"活着"(添加到活动中)以便它们可以相互通信吗? (2认同)
  • 我一直把片段视为类似于Web部分视图的东西......我开始明白我错了,或者更好,我不对.感谢@GlennBech的解释,我会把你的答案作为追求此事的线索;) (2认同)
  • 更大的问题是开发人员如何知道何时使用片段以及何时不使用片段? (2认同)

Nik*_*kov 68

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

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

  • 阅读开发指南条目,它有足够的细节.你不太可能在SO上得到"片段的酷用途"的答案 - 模糊而且没有单一的答案.4号在开发指南中得到了特别的回答 - http://developer.android.com/guide/topics/fundamentals/fragments.html#CommunicatingWithActivity (5认同)
  • 感谢android开发人员坚持对基本问题的解答。ATM在Fragment类中,对于使用XML“ include”标记而言,我没有看到任何有用的信息。我会发现有价值的事情是能够指定一种布局,该布局可以在所有分辨率下神奇地转变为最佳用户体验。据我所知,您仍然需要自己编写代码。另一个潜在的价值是将代码和资源捆绑到可重用组件中的方法,这些组件在重用应用程序中找不到,但似乎再也不存在。我想要一个很好的理由。 (2认同)
  • 我开始理解谷歌建议使用片段的方式,但我完全同意@NikolayElenkov.对我来说,使用活动似乎仍然是最强大和最不复杂的方式. (2认同)

man*_*ani 45

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

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

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

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

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

  4. 片段可用于多个活动.

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

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

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

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

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

  • 关于#8,无布局片段(即“无头”片段)的一个可能示例是执行一项任务,尽管它有点短(例如短的 HTTP 请求)仍然需要在配置更改后幸存下来,因此取决于在它们之间保留的确切片段实例上(通过在片段上使用 setRetainInstance(true) )。至于布局片段, setRetainInstance(true) 没有多大意义,因为它会阻止与其视图相关的资源在必要时被释放(即内存泄漏)。 (2认同)

Kav*_*wal 16

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

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

通过使每个屏幕成为一个单独的片段,完全避免了这种数据传递的麻烦.片段始终存在于给定Activity的上下文中,并且始终可以访问该Activity.通过在Activity中存储感兴趣的信息,每个屏幕的片段可以通过Activity简单地访问对象引用.

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

  • 这是真的,但有解决方案:当它不是一个巨大的对象时使用Parcelable(并且有一个插件可以使它更容易),如果它是一个巨大的对象,你总是可以使用一个静态引用,它将设置为null当你进入新活动时(或根据你的要求销毁它). (3认同)

Nit*_*aby 7

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

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

我是Android新手,仍然认为片段有用这种方式.


ein*_*eee 5

我知道这已经被讨论到死,但我想补充几点:

  • Frags 可用于填充Menus 并可以MenuItem自行处理点击。从而为您的活动提供更多调制选项。您可以在 Activity 不知道的情况下执行 ContextualActionBar 等操作,并且基本上可以将其与您的 Activity 处理的基本内容(导航/设置/关于)分离。

  • 带有子 Frag 的父 Frag 可以为您提供更多选项来模块化您的组件。例如,您可以轻松地交换 Frags,将新 Frags 放入 Pager 中或移除它们,重新排列它们。所有这些都不需要您的 Activity 对其一无所知,而只是专注于更高级别的东西。


小智 5

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

例:

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

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

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

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

  • 完美的答案! (3认同)