为什么要使用片段,以及何时使用片段代替活动?


484

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

Google在视频中建议,在可能的情况下(link1link2),我们应该使用片段而不是活动,但它们并没有确切说明原因。

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

我的问题是关于片段的:

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

奖励问题:

  1. 您能为片段提供一些非常有趣的用途吗?Google在影片中没有提及的内容?
  2. 在片段和包含片段的活动之间进行交流的最佳方式是什么?
  3. 使用片段时要记住的最重要的事情是什么?您的经验中有任何提示和警告吗?


Answers:


282

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

片段是Android创建可重用用户界面的解决方案。您可以使用活动和布局(例如,使用包含)来实现某些相同的目的。然而; 片段通过HoneyComb或更高版本连接到Android API。让我详细说明;

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

  • FragmentManager巧妙地为您处理“后退” 手柄。上一步并不意味着返回到上一个活动,就像常规活动一样。这意味着回到先前的片段状态。

  • 您可以将酷ViewPager与一起使用FragmentPagerAdapter来创建滑动界面。该FragmentPagerAdapter代码比常规适配器干净得多,并且它控制各个片段的实例化。

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

  • 您甚至可以并且应该为仅用于手机的应用程序使用片段。如果您要考虑便携性。我使用ActionBarSherlock和兼容性库来创建“具有ICS外观”的应用程序,这些应用程序在回溯到1.6版之前一直一样。您可以使用ActionBar,带有标签,溢出,拆分操作栏,viewpager等最新功能。

红利2

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


5
首先,谢谢。我感谢能提供有用信息(但简短)的人,而不仅仅是给我提供了手册的链接。无论如何,除了可以在特殊类上工作的其他功能之外,您还能想到使用片段的优点和缺点吗? ?
Android开发人员

4
我认为您必须直接询问。我上面给出了四个主要优点。
Glenn Bech 2012年

2
好的,与自定义视图和活动相比,劣势又如何呢?
Android开发人员

2
您如何使用意图在片段之间进行交流?所有片段都需要“活跃”(添加到活动中)以便彼此通信吗?
android开发人员

55
一个片段永远不能直接与另一个片段对话-而是通过父活动进行。这样,您最终不会得到意粉代码,但易于管理代码。
老虎机

70

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

简而言之,片段存在于活动中,每个活动可以承载许多片段。与活动类似,它们具有特定的生命周期,与活动不同,它们不是顶级应用程序组件。片段的优势包括代码重用和模块化(例如,在许多活动中使用相同的列表视图),包括构建多窗格界面的能力(在平板电脑上最有用)。主要缺点是(有些)增加了复杂性。通常,您可以使用(非定制的)非标准且不那么可靠的视图来实现(自定义)视图的相同功能。


1
更新的问题。现在,它具有指向Google视频的链接。另外,感谢您的解释,但我仍然需要澄清我的问题。
android开发人员

5
阅读开发指南条目,它具有足够的详细信息。您不太可能在SO上获得“碎片的巧妙利用”的答案-含糊不清的方式,没有一个答案。数4 specificlly回答在开发guide-- developer.android.com/guide/topics/fundamentals/...
尼古拉Elenkov

1
据我所知,这种方法建立了哪个活动可以包含哪个片段的依赖。另外,请回答主要问题(前两个)。
Android开发人员

3
感谢android开发人员坚持对基本问题的解答。ATM在Fragment类中,对于使用XML“ include”标记而言,我没有看到任何有用的信息。我会发现有价值的事情是能够指定一种布局,该布局可以在所有分辨率下神奇地转变为最佳用户体验。据我所知,您仍然需要自己编写代码。另一个潜在的价值是将代码和资源捆绑到可重用的组件中的方式,这些组件在重用应用程序中找不到,但是似乎仍然没有。我想要一个很好的理由。
梅琳达·格林

2
我开始理解的方式使用谷歌的片段建议,但我还算有@NikolayElenkov同意..对我来说,使用活动似乎仍然是最强大的和不太复杂的方式..
andrea.rinaldi

49

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

以下是有关片段的重点:

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

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

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

  4. 一个片段可以用于多个活动。

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

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

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

  8. 片段已添加到API版本11的Android 3(Honeycomb)中的Android API中。

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


1.如您在#8所述,它不必具有布局。6.您错过了“均值”之后的部分。无论如何,感谢您帮助其他人弄清楚了。我会给你+1。
android开发人员

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

注意:“#8”现在是“#7”。
ToolmakerSteve

21

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

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

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

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


3
没错,但是有解决方案:当Parcelable不是很大的对象(并且有一个插件可以使它变得更容易)时,请使用Parcelable;如果它是很大的对象,则始终可以使用将其设置为null的静态引用当您进入新活动时(或根据需要将其销毁时)。
Android开发人员

@androiddeveloper:“使用可打包”符合我对“通过使用片段避免的数据传递头痛”的定义。如果在经过一系列屏幕时需要保留复杂的共享状态,那么“活动+片段”是一个很好的解决方案,恕我直言。(尽管我放弃了Fragment返回堆栈,并自行管理“ back”的含义。)
ToolmakerSteve

通过容器活动在片段之间使用接口设计模式是一种非常模块化的方法,不仅可以将对象传递,还可以将单击事件侦听器和方法参数传递回其他片段或主容器活动。
Kaveesh Kanwal

10

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

例:

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

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

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

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

完美的答案!
萨特什

8

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

如果您使用了活动,则必须将抽屉保留在所有活动中,这会产生冗余代码。这是片段的一种有趣用法。

我是Android的新手,但仍然认为片段有助于这种方式。


是。但是,我有时仍然对使用片段的正确方法感到困惑,这是因为片段和活动的生命周期都很复杂。
android开发人员

@androiddeveloper您只使用活动吗?
Michael Alan Huff

@MichaelAlanHuff支持平板电脑时,我认为最好使用Fragments。另外,当支持方向更改和其他类似事件时,您可能希望使用DialogFragment,因为它允许您还原它们-android
开发人员

@androiddeveloper,这也是我的想法。我没有经常使用DialogFragments。为了帮助实现逻辑的模块化,许多android开发人员开始使用自定义视图来保留逻辑。这是来自Airbnb的工程师最近发表的关于自定义视图的演讲vimeo.com/127799187
Michael Alan Huff

如果您认为当前屏幕可能是另一个屏幕的一部分,则使用片段的@MichaelAlanHuff也会很有用。
Android开发人员

5

我知道这已经讨论到死了,但是我想补充一点:

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

  • 带有子Frags的父Frag可以为您提供更多选项来调制组件。例如,您可以轻松地交换碎片,将新的碎片放在传呼机中或将其删除,重新排列它们。所有这些都使您的活动一无所知,只专注于更高层次的内容。


0

片段生活在活动中,并具有:

  • 自己的生命周期
  • 自己的布局
  • 它自己的子片段等

将片段视为其所属主要活动的子活动,它不能独立存在,可以一次又一次地被调用/重用。希望这可以帮助 :)


实际上,关于第二点(“它自己的布局”),这是可选的。片段根本不需要有视图。
Android开发人员

0

1.使用片段的目的?

  • 答:
    1. 处理设备尺寸差异。
    2. 在应用程序屏幕之间传递信息。
    3. 用户界面组织。
    4. 高级UI隐喻。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.