[英]Why fragments, and when to use fragments instead of activities?
在 Android API 11+ 中,Google 发布了一个新的 class 叫做Fragment
。
在视频中,谷歌建议尽可能( link1 , link2 ),我们应该使用片段而不是活动,但他们没有解释确切原因。
片段的目的是什么以及它们的一些可能用途(除了一些可以通过简单视图/布局轻松实现的 UI 示例)?
我的问题是关于片段:
奖金问题:
#1 & #2 使用片段的目的是什么?与使用活动/视图/布局相比,使用片段的优缺点是什么?
Fragment 是 Android 创建可重用用户界面的解决方案。 您可以使用活动和布局(例如使用包含)来实现一些相同的事情。 然而; 片段被连接到 Android API,来自 HoneyComb 等。 让我详细说明;
操作ActionBar
。 如果您希望标签在那里导航您的应用程序,您很快就会看到ActionBar.TabListener
接口为您提供FragmentTransaction
作为onTabSelected
方法的输入参数。 您可能会忽略这一点,并做一些其他聪明的事情,但是您将针对 API 工作,而不是使用它。
FragmentManager
以非常聪明的方式为您处理“返回”。 返回并不意味着回到上一个活动,就像常规活动一样。 这意味着回到之前的片段状态。
您可以使用带有FragmentPagerAdapter
的酷炫ViewPager
来创建滑动界面。 FragmentPagerAdapter
代码比常规适配器简洁得多,它控制各个片段的实例化。
如果您在尝试为手机和平板电脑创建应用程序时使用 Fragments,您的生活会轻松很多。 由于这些片段与 Honeycomb+ API 紧密相连,因此您也希望在手机上使用它们来重用代码。 这就是兼容性库派上用场的地方。
您甚至可以并且应该将片段用于仅适用于手机的应用程序。 如果您考虑便携性。 我使用ActionBarSherlock
和兼容性库来创建“ICS 外观”应用程序,从 1.6 版开始,这些应用程序看起来都一样。 您可以获得最新的功能,例如ActionBar
,带有选项卡、溢出、拆分操作栏、viewpager 等。
奖金 2
在片段之间进行通信的最佳方式是意图。 当您按下 Fragment 中的某些内容时,您通常会调用带有数据的StartActivity()
。 意图被传递到您启动的活动的所有片段。
不确定您指的是什么视频,但我怀疑他们是说您应该使用片段而不是活动,因为它们不能直接互换。 Dev Guide 中实际上有一个相当 详细的条目,请考虑阅读它以获取详细信息。
简而言之,片段存在于活动中,每个活动可以承载许多片段。 与活动一样,它们具有特定的生命周期,与活动不同,它们不是顶级应用程序组件。 片段的优点包括代码重用和模块化(例如,在许多活动中使用相同的列表视图),包括构建多窗格界面的能力(主要在平板电脑上有用)。 主要缺点是(一些)增加了复杂性。 您通常可以以非标准且不太稳健的方式使用(自定义)视图实现相同的目的。
Fragment 是应用程序的用户界面或行为的一部分,可以放置在 Activity 中,从而实现更加模块化的 Activity 设计。 如果我们说一个片段是一种子活动,这并没有错。
以下是关于片段的要点:
片段有自己的布局和自己的行为以及自己的生命周期回调。
您可以在活动运行时在活动中添加或删除片段。
您可以在单个活动中组合多个片段以构建多窗格 UI。
一个片段可以用于多个活动。
片段生命周期与其宿主活动的生命周期密切相关。
当活动暂停时,活动中所有可用的片段也将停止。
片段可以实现没有用户界面组件的行为。
在 API 版本 11 的Android 3 (Honeycomb) 中,片段被添加到 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:
对比
活动 A,片段 1,片段 2,片段 3:
片段在某些情况下特别有用,例如我们希望在所有页面中保留导航抽屉。 您可以使用您想要的任何片段来扩展框架布局,并且仍然可以访问导航抽屉。
如果您使用了一个活动,您将不得不在所有活动中保留抽屉,这会产生冗余代码。 这是片段的一种有趣用法。
我是 Android 新手,仍然认为片段在这方面很有帮助。
我知道这已经被讨论到死,但我想补充几点:
Frags 可用于填充Menu
并可自行处理MenuItem
点击。 从而为您的活动提供更多调制选项。 您可以在 Activity 不知道的情况下执行 ContextualActionBar 等操作,并且基本上可以将其与您的 Activity 处理的基本内容(导航/设置/关于)分离。
带有子 Frag 的父 Frag 可以为您提供更多选项来模块化您的组件。 例如,您可以轻松地交换 Frags,将新 Frags 放入 Pager 中或移除它们,重新排列它们。 所有这些都不需要您的 Activity 对其一无所知,而只是专注于更高级别的东西。
片段存在于活动中,而活动本身存在。
Fragments 存在于 Activity 中,并且具有:
将 Fragments 视为它所属的主要活动的子活动,它不能单独存在并且可以一次又一次地调用/重用。 希望这可以帮助 :)
1.使用fragment的目的?
在Android API 11+中,Google发布了一个名为Fragment
的新类。
Google在视频中建议,只要有可能( link1 , link2 ),我们都应该使用片段而不是活动,但是他们没有确切说明原因。
片段的目的是什么以及它们的可能用途(除了一些可以通过简单的视图/布局轻松实现的UI示例)?
我的问题是关于片段的:
奖励问题:
Fragment
可以被认为是 ui 元素的复合树中的非根组件,而活动位于复合森林(ui 树)的顶部。
关于何时不使用Fragment
的经验法则是,当作为一个孩子时, Fragment
具有相互冲突的属性,例如,它可能是沉浸式的,或者可能一起使用不同的样式,或者具有其他一些架构/逻辑差异并且不适合在现有的树齐。
关于何时更喜欢Activity
不是Fragment
的经验法则是当任务(或一组连贯的任务)完全独立且可重用,并且进行一些举重工作,并且不应进一步负担以符合另一个父子组合(违反 SRP) ,第二个责任是符合组合)。 例如,捕获音频、视频、照片等并允许编辑、去除噪声、照片注释等的MediaCaptureActivity
。 此活动/模块可能具有执行更细粒度工作并符合公共显示主题的子片段。
如果你以前写过前端,那么就使用像(React、Vue 或 Angular)这样的前端组件。 想想像活动中的可重用组件这样的片段。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.