【磨叽教程】Android进阶之Fragment原理

Android 在 Android 3.0(API 级别 11)中引入了Fragment。主要目的是为大屏幕(如平板电脑)上更加动态和灵活的界面设计提供支持。
由于平板电脑的屏幕尺寸远胜于手机屏幕尺寸,因而有更多空间可供我们自由去组合界面。
利用Fragment是绝佳的实践方式,无需对视图层次结构的复杂更改做过多管理。
通过将 Activity 布局分成各个Fragment,可以在运行过程中修改 Activity 的界面外观,并在由 Activity 管理的返回栈中管理这些Fragment。

例如,新闻应用可以使用一个Fragment在左侧显示文章列表,使用另一个Fragment在右侧显示文章详情 — 两个片段并排显示在一个 Activity 中,每个Fragment都拥有自己的一套生命周期回调方法,并各自处理自己的用户输入事件。因此,开发者不需要使用一个 Activity 来做选择文章列表,然后使用另一个 Activity 来阅读文章详情,而是可以在同一个 Activity 内选择文章并进行阅读,如图 1 中的平板电脑布局所示。
在这里插入图片描述

在我们开发过程中应将每个Fragment都设计为可重复使用的模块化 Activity 组件。

换言之,由于每个Fragment都会通过各自的生命周期回调来定义自己的布局和行为,所以我们可以将一个Fragment在多个 Activity中使用。

因此,采用可复用式设计可避免直接通过某个Fragment操纵另一个Fragment。这一点颇为重要,因为模块化Fragment允许您更改Fragment的组合方式,从而适应不同的屏幕尺寸。在设计可同时支持平板电脑和手机的应用时,可以在不同的布局配置中重复使用这些Fragment,以根据可用的屏幕空间优化用户体验。

例如,在手机上,如果不能在同一 Activity 内显示多个Fragment,则必须利用单独的Fragment来实现单窗格界面。也就是所谓的大小屏适配。

仍以新闻应用为例,在平板电脑尺寸的设备上运行时,该应用可以在 Activity A 中嵌入两个Fragment(一个是列表,一个是详情)。如果该应用运行在手机等小屏幕设备上的时候,屏幕空间就不足以同时展示这两个Fragment,因此 Activity A 只包含用于显示文章列表的Fragment,并且当用户选择文章时,它才会启动 Activity B,其包含用于阅读文章的第二个Fragment。因此,应用可通过重复使用不同组合的Fragment来同时支持平板电脑和手机。

在了解Fragment的使用场景后,Fragment的声明周期才是我们最应该关心的问题。
在我们使用Fragment的时候,必须继承Fragment类或者其子类方可。
下面我们先看下Fragment的声明周期中都拥有哪些回调:
在这里插入图片描述

Fragment 类的代码与 Activity 非常相似。它包含与 Activity 类似的回调方法,如 onCreate()、onStart()、onPause() 和 onStop()。
但是要想实现Fragment,则如下几个回调是我们必须实现的。

onCreate()

系统会在创建Fragment时调用此方法。当Fragment经历暂停或停止状态继而恢复后,如果希望保留此Fragment的基本组件,则应在您的实现中将其初始化。

onCreateView()

系统会在Fragment首次绘制其界面时调用此方法。如要为您的Fragment绘制界面,您从此方法中返回的 View 必须是Fragment布局的根视图。如果Fragment未提供界面,则可以返回 null。

onPause()

系统会将此方法作为用户离开Fragment的第一个信号(但并不总是意味着此Fragment会被销毁)进行调用。通常,您应在此方法内确认在当前用户会话结束后仍然有效的任何更改(因为用户可能不会返回)。
大多数应用至少要为每个Fragment实现这三个方法,并使用其他回调方法来处理Fragment生命周期的其他各个阶段。
管理Fragment生命周期与管理 Activity 生命周期很相似。和 Activity 一样,Fragment也以三种状态存在:

已恢复

Fragment在运行中的 Activity 中可见。

已暂停

另一个 Activity 位于前台并具有焦点,但此Fragment所在的 Activity 仍然可见(前台 Activity 部分透明,或未覆盖整个屏幕)。

已停止

Fragment不可见。宿主 Activity 已停止,或Fragment已从 Activity 中移除,但已添加到返回栈。已停止的Fragment仍处于活动状态(系统会保留所有状态和成员信息)。不过,它对用户不再可见,并随 Activity 的终止而终止。

与 Activity 一样,也可以使用 onSaveInstanceState(Bundle)、ViewModel 和持久化本地存储的组合,在配置变更和进程终止后保留Fragment的界面状态。

对于 Activity 生命周期与Fragment生命周期而言,二者最显著的差异是在其各自返回栈中的存储方式。默认情况下,Activity 停止时会被放入由系统管理的 Activity 返回栈中(以便用户通过返回按钮回退到 Activity)。而Fragment只有当您在移除Fragment的事务执行期间通过调用 addToBackStack() 显式请求保存实例时,系统才会将片段放入由宿主 Activity 管理的返回栈。

在其他方面,管理Fragment生命周期与管理 Activity 生命周期非常相似;对此可采取与之相同的做法。请参阅之前课程了解有关 Activity 生命周期及其管理措施的详情。

注意:如果在 Fragment 中需要 Context 对象,则可以调用 getContext()。但请注意,只有在该Fragment附加到 Activity 时才需调用 getContext()。如果尚未附加该Fragment,或者其在生命周期结束期间已分离,则 getContext() 返回 null。

另外需要注意Fragment的声明周期和Activity的声明周期是具备一致性的。

Fragment所在 Activity 的生命周期会直接影响Fragment的生命周期,其表现为Activity 的每次生命周期回调都会引发每个Fragment的类似回调。例如,当 Activity 收到 onPause() 时,Activity 中的每个Fragment也会收到 onPause()。

不过,Fragment还有几个额外的生命周期回调,用于处理与 Activity 的唯一交互,从而执行构建和销毁Fragment界面等操作。这些额外的回调方法是:

onAttach()

在片段已与 Activity 关联时进行调用(Activity 传递到此方法内)。

onCreateView()

调用它可创建与片段关联的视图层次结构。

onActivityCreated()

当 Activity 的 onCreate() 方法已返回时进行调用。

onDestroyView()

在移除与片段关联的视图层次结构时进行调用。

onDetach()

在取消片段与 Activity 的关联时进行调用。

一旦 Activity 达到已恢复状态,便可随意向 Activity 添加Fragment和移除其中的Fragment。因此只有当 Activity 处于已恢复状态时,Fragment的生命周期才能独立变化。
不过,当 Activity 离开已恢复状态时,Fragment会在 Activity 的推动下再次经历其生命周期。

扩展:
除了Fragment的基类外,系统也帮助我们实现了一些其它子类,下面我们着重介绍下常用的几个:

DialogFragment

显示浮动对话框。使用此类创建对话框可有效代替使用 Activity 类中的对话框辅助方法,因为可以将Fragment对话框纳入由 Activity 管理的Fragment返回栈,从而使用户能够返回清除的Fragment。

ListFragment

显示由适配器(如 SimpleCursorAdapter)管理的一系列项目,类似于 ListActivity。该类提供几种管理列表视图的方法,如用于处理点击事件的 onListItemClick() 回调。(请注意,显示列表的首选方法是使用 RecyclerView,而非 ListView。在此情况下,您需在列表布局中创建包含 RecyclerView 的Fragment。如需了解具体操作方法,请参阅使用 RecyclerView 创建列表)

PreferenceFragmentCompat

以列表形式显示 Preference 对象的层次结构。此类用于为您的应用创建设置屏幕。

本节先介绍到这里,下节我们看下在实际项目中是如何使用并玩转Fragment的。有问题欢迎关注“计算机自学平台”并留言讨论哦。

猜你喜欢

转载自blog.csdn.net/farley119/article/details/108048323