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

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

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

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

我的问题是关于片段的:

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

奖金问题:

  1. 您能否为片段提供一些真正有趣的用途?谷歌在他们的视频里没有提到的事情?
  2. 在片段和包含它们的活动之间进行通信的最佳方式是什么?
  3. 当你使用片段时,最重要的事情是什么?从你的经验中有什么建议和警告吗?
262118 次浏览

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

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

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

Fragments是Android用于创建可重用用户界面的解决方案。您可以使用活动和布局(例如使用include)来实现一些相同的功能。然而;fragments被连接到Android API中,从HoneyComb开始。让我详细说明;

  • # EYZ0。如果你想让标签在那里导航你的应用程序,你很快就会看到ActionBar.TabListener接口给了你一个FragmentTransaction作为onTabSelected方法的输入参数。您可能可以忽略这一点,并做一些其他更聪明的事情,但您将与API作对,而不是与它一起工作。

  • FragmentManager以一种非常聪明的方式为您处理«back»。Back不是指回到上一个活动,就像常规活动一样。它意味着回到之前的片段状态。

  • 你可以使用ViewPagerFragmentPagerAdapter来创建滑动界面。FragmentPagerAdapter代码比常规适配器简洁得多,它控制单个片段的实例化。

  • 当您尝试为手机和平板电脑创建应用程序时,如果使用Fragments,您的生活会轻松得多。由于这些片段与Honeycomb+ api紧密联系在一起,你也会想在手机上使用它们来重用代码。这就是兼容性库派上用场的地方。

  • 你甚至可以也应该在手机应用中使用fragments。如果你考虑到可移植性。我使用ActionBarSherlock和兼容性库来创建“ICS外观”应用程序,这些应用程序在1.6版本中看起来都是一样的。您可以获得最新的功能,如ActionBar,带有标签,溢出,拆分操作栏,viewpager等。

奖金2

片段之间最好的沟通方式是意图。当你在Fragment中按下一些东西时,你通常会调用带有数据的StartActivity()。意图被传递到您启动的活动的所有片段。

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

以下是关于片段的要点:

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

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

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

  4. 一个片段可以在多个活动中使用。

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

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

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

  8. 片段被添加到Android API在Android 3(蜂窝)与API版本11。

更多详情,请访问官方网站< a href = " http://developer.android.com/guide/components/fragments.html " > < / >碎片

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

如果您使用了一个活动,那么您将不得不在所有活动中保留抽屉,这将导致冗余代码。这是片段的一个有趣用法。

我是Android的新手,仍然认为碎片是有帮助的。

我知道这个问题已经讨论得很激烈了,但我想再补充几点:

  • Frags可以用来填充Menus,并可以自己处理MenuItem的点击。从而为您的活动提供进一步的调制选项。你可以做ContextualActionBar的东西等等,没有你的活动知道它,基本上可以从基本的东西你的活动处理(导航/设置/关于)。

  • 带有子Frags的父fragg可以为您提供进一步的组件模块化选项。例如,你可以很容易地交换碎片周围,把新的碎片内寻呼机或删除他们,重新安排他们。这一切都是在你的活动对它一无所知的情况下进行的,只是专注于更高层次的东西。

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

过去,Android应用程序中的每个屏幕都是作为一个单独的Activity来实现的。这为在屏幕之间传递信息带来了挑战,因为Android Intent机制不允许在活动之间直接传递引用类型(即对象)。相反,对象必须被序列化,或者一个全局可访问的引用可用。

通过使每个屏幕成为一个单独的片段,这种数据传递令人头痛 完全避免了。的上下文中始终存在片段 给定的活动,并且总是可以访问该活动。通过存储 活动中感兴趣的信息,每个信息的片段 屏幕可以简单地通过Activity.

.访问对象引用

来源:# EYZ0

片段存在于活动内部,而活动则独立存在。

Fragments存在于活动中,并具有:

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

将Fragments视为它所属的主活动的子活动,它不能单独存在,它可以一次又一次地被调用/重用。希望这对你有所帮助。

1.使用片段的目的是什么?

    <李>答:
    1. 处理器件形状因子差异。
    2. 在应用程序屏幕之间传递信息。
    3. 用户界面组织。
    4. 高级UI隐喻。
    5. 李< / ol > < / >
活动是应用程序中带有工具栏的全屏组件,其他内容最好是片段。 一个带有工具栏的全屏父活动可以有多个窗格、可滚动页面、对话框等(所有片段),所有这些都可以从父活动中访问,并通过父活动进行通信

例子:

# EYZ0

    所有的活动都需要有相同的代码重复,以显示一个基本的 工具栏,或者从父活动继承 .
  • 要从一个活动移动到另一个活动,要么所有活动都需要在内存中(开销),要么需要销毁一个活动以便打开另一个活动。
  • 活动之间的通信可以通过intent完成。

vs

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

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

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

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

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

如果你以前写过前端,那么使用前端组件(React, Vue或Angular)。想想活动中的可重用组件这样的片段。

为什么碎片呢?

片段被创建来替换大多数活动用例。看Android开发峰会

什么时候使用片段而不是活动?

总是这样,除非你真的需要一个只在活动中可用的API。