在 Android API 11+ 中,Google 发布了一个名为 Fragment
的新类。
在视频中,Google 建议尽可能(link1、link2)我们应该使用片段而不是活动,但他们没有解释具体原因。
片段的目的和它们的一些可能用途是什么(除了一些可以通过简单视图/布局轻松实现的 UI 示例)?
我的问题是关于片段:
使用片段的目的是什么?与使用活动/视图/布局相比,使用片段有哪些优点和缺点?
奖励问题:
你能给片段一些真正有趣的用途吗?谷歌在他们的视频中没有提到的事情?在片段和包含它们的活动之间进行通信的最佳方式是什么?使用片段时要记住的最重要的事情是什么?您的经验中有什么提示和警告吗?
#1 & #2 使用片段的目的是什么?与使用活动/视图/布局相比,使用片段的优缺点是什么?
片段是 Android 创建可重用用户界面的解决方案。您可以使用活动和布局(例如使用包含)来实现一些相同的目的。然而;片段从 HoneyComb 和更高版本连接到 Android API。让我详细说明;
操作栏。如果您希望在上面的选项卡导航您的应用程序,您很快就会看到 ActionBar.TabListener 接口为您提供了 FragmentTransaction 作为 onTabSelected 方法的输入参数。您可能会忽略这一点,并做一些其他聪明的事情,但是您将针对 API 工作,而不是使用它。
FragmentManager 以一种非常聪明的方式为您处理 «back»。 Back 并不意味着回到上一个活动,就像常规活动一样。这意味着回到之前的片段状态。
您可以将酷炫的 ViewPager 与 FragmentPagerAdapter 一起使用来创建滑动界面。 FragmentPagerAdapter 代码比常规适配器更简洁,它控制各个片段的实例化。
如果您在尝试为手机和平板电脑创建应用程序时使用 Fragments,您的生活会轻松很多。由于这些片段与 Honeycomb+ API 紧密相关,因此您也希望在手机上使用它们以重用代码。这就是兼容性库派上用场的地方。
您甚至可以并且应该将片段用于仅适用于手机的应用程序。如果您考虑到便携性。我使用 ActionBarSherlock 和兼容性库来创建“看起来像 ICS”的应用程序,这些应用程序在 1.6 版中看起来都一样。您可以获得最新的功能,如 ActionBar,带有选项卡、溢出、拆分操作栏、viewpager 等。
奖金 2
在 Fragment 之间进行通信的最佳方式是 Intent。当您按下 Fragment 中的某些内容时,您通常会调用 StartActivity()
并在其上显示数据。意图将传递给您启动的活动的所有片段。
不确定您指的是什么视频,但我怀疑他们是否说您应该使用片段而不是活动,因为它们不能直接互换。开发指南中实际上有一个相当detailed entry,请考虑阅读它以了解详细信息。
简而言之,Fragment 存在于 Activity 中,每个 Activity 可以承载许多 Fragment。与活动一样,它们具有特定的生命周期,与活动不同,它们不是顶级应用程序组件。片段的优点包括代码重用和模块化(例如,在许多活动中使用相同的列表视图),包括构建多窗格界面的能力(主要用于平板电脑)。主要缺点是(一些)增加了复杂性。您通常可以使用(自定义)视图以非标准且不太健壮的方式实现相同的目标。
片段是应用程序用户界面或行为的一部分,可以放置在活动中,从而实现更加模块化的活动设计。如果我们说片段是一种子活动,那并没有错。
以下是有关片段的要点:
片段有自己的布局和自己的行为以及自己的生命周期回调。您可以在活动运行时在活动中添加或删除片段。您可以在单个活动中组合多个片段以构建多窗格 UI。一个片段可以用于多个活动。片段生命周期与其宿主活动的生命周期密切相关。当活动暂停时,活动中所有可用的片段也将停止。片段可以实现没有用户界面组件的行为。在 API 版本 11 的 Android 3 (Honeycomb) 中,Fragment 添加到了 Android API。
有关详细信息,请访问官方网站 Fragments。
这是我在片段中发现的重要信息:
从历史上看,Android 应用程序中的每个屏幕都是作为单独的 Activity 实现的。这对在屏幕之间传递信息造成了挑战,因为 Android Intent 机制不允许在活动之间直接传递引用类型(即对象)。相反,必须对对象进行序列化或提供全局可访问的引用。通过使每个屏幕成为一个单独的 Fragment,完全避免了这种数据传递问题。片段始终存在于给定 Activity 的上下文中,并且始终可以访问该 Activity。通过将感兴趣的信息存储在 Activity 中,每个屏幕的 Fragment 可以简单地通过 Activity 访问对象引用。
来源:https://www.pluralsight.com/blog/software-development/android-fragments
活动是应用程序中带有工具栏的全屏组件,其他所有内容最好是片段。一个带有工具栏的全屏父 Activity 可以有多个窗格、可滚动页面、对话框等(所有片段),所有这些都可以从父节点访问并通过父节点进行通信。
例子:
活动 A、活动 B、活动 C:
所有活动都需要重复相同的代码,例如显示基本工具栏,或从父活动继承(管理起来很麻烦)。
要从一个活动转移到另一个活动,要么所有活动都需要在内存中(开销),要么需要销毁一个活动才能打开另一个活动。
活动之间的通信可以通过 Intents 完成。
对比
活动A,片段1,片段2,片段3:
没有代码重复,所有屏幕都有来自该活动的工具栏等。
从一个片段移动到下一个片段的几种方法 - 查看寻呼机、多窗格等。
Activity 拥有最多的数据,因此需要最少的片段间通信。如果仍然需要,可以通过接口轻松完成。
片段不需要是全屏的,设计它们有很大的灵活性。
如果不需要视图,片段不需要膨胀布局。
多个活动可以使用同一个片段。
片段在某些情况下特别有用,例如我们希望在所有页面中保留导航抽屉。您可以使用您想要的任何片段来扩展框架布局,并且仍然可以访问导航抽屉。
如果您使用了活动,则必须将抽屉保留在所有活动中,这会产生冗余代码。这是片段的一个有趣用途。
我是 Android 新手,但仍然认为片段以这种方式很有帮助。
我知道这已经被讨论死了,但我想补充几点:
Frags 可用于填充菜单并可以自行处理 MenuItem 单击。从而为您的活动提供更多调制选项。您可以在 Activity 不知道的情况下执行 ContextualActionBar 等操作,并且基本上可以将其与 Activity 处理的基本内容(导航/设置/关于)分离。
带有子 Frags 的父 Frag 可以为您提供更多选项来模块化组件。例如,您可以轻松交换 Frags,将新 Frags 放入 Pager 或移除它们,重新排列它们。所有这些都没有您的 Activity 对它一无所知,只是专注于更高级别的东西。
Fragments 存在于 Activity 中,并且具有:
自己的生命周期
自己的布局
它自己的子片段等。
将 Fragments 视为它所属的主要活动的子活动,它不能单独存在,并且可以一次又一次地调用/重用。希望这可以帮助 :)
片段存在于活动中,而活动则单独存在。
Fragment
可以被认为是 ui 元素复合树中的非根组件,而活动位于复合森林(ui 树)的顶部。
关于何时不使用 Fragment 的经验法则是,当 Fragment 作为一个孩子时具有冲突的属性,例如,它可能是身临其境的,或者可能一起使用不同的风格,或者有一些其他的架构/逻辑差异并且不适合在现有的树中同构。
关于何时更喜欢 Activity 而不是 Fragment 的经验法则是,当任务(或一组连贯的任务)完全独立且可重用并且进行一些繁重的举重并且不应该进一步负担以符合另一个父子组合时(违反 SRP ,第二个责任是符合复合材料)。例如,一个 MediaCaptureActivity 捕获音频、视频、照片等,并允许编辑、去噪、照片上的注释等。这个活动/模块可能有子片段,这些片段做更精细的工作并符合一个共同的显示主题。
如果你以前写过前端,那么使用前端组件,如(React、Vue 或 Angular)。想想像活动中的可重用组件这样的片段。
1.使用片段的目的?
Ans: 处理设备外形差异。在应用程序屏幕之间传递信息。用户界面组织。高级 UI 隐喻。
处理设备外形尺寸差异。
在应用程序屏幕之间传递信息。
用户界面组织。
高级 UI 隐喻。