引入Fragment原来是这么回事
Fragment作为Android最基本、最重要的基础概念之一,在开发中经常会用到,本章我们一起来学习 Fragment的使用。
一、Fragment概述
Fragment 是一种可以嵌人在Activity中的UI片段,它能让程序更加合理地利用大屏幕空间,因而Fragment在平板上应用非常广泛。Fragment与Activity十分相似,它包含布局,同时也具有自己的生命周期。
一个Fragment代表着Activity中一种行为或者Activity用户界面中的一部分。我们可以将多个Fragment组合在一个Activity中,组成一个多窗格布局;同样我们也可以在多个Activity中重复使用某个Fragment。我们可以将Fragment当作一个Activity中的小模块(它有它自己的生命周期,自己的事件处理机制),在Activity运行过程中,我们可以动态地添加或者移除这个模块。
Android 3.0引入Fragment的初衷是为了适应大屏幕的平板电脑,由于平板电脑的屏幕比手机屏幕更大,因此可以容纳更多的UI组件,且这些UI组件之间存在交互关系。Fragment简化了大屏幕UI的设计,它不需要开发者管理组件包含关系的复杂变化,开发者使用Fragment对 UI组件进行分组、模块化管理,就可以更方便地在运行过程中动态更新 Activity的用户界面。
比如说:我们的应用中有一个文章列表和文章详情页面,由于平板设备空间大,列表Fragment和详情Fragment可以放在同一个页面中,而在手持设备上,则分为两个Activity作展示。如下图:
如上图所示的新闻浏览界面,该界面需要在屏幕左边显示新闻列表,并在屏幕右边显示新闻内容,此时就可以在Activity中显示两个并排的Fragment:左边的Fragment显示新闻列表,右边的Fragment显示新闻内容。由于每个Fragment都拥有自己的生命周期,并可响应用户输入事件,因此可以非常方便地实现:当用户单击左边列表中的指定新闻时,右边的Fragment就会显示相应的新闻内容。上图所示左边的“平板电脑”部分显示了这种UI界面。
通过使用上面的Fragment设计机制,可以取代传统的让一个Activity显示新闻列表,另—个Activity显示新闻内容的设计。由于Fragment是可复用的组件,因此如果需要在正常尺寸的手机屏幕上运行该应用,则可以改为使用两个 Activity: Activity A 包含 Fragment A、Activity B 包含 FragmentB。其中 ActivityA仅包含显示文章列表的Fragment A,而当用户选择一篇文章时,它会启动包含新闻内容的Activity B,如上图所示右边的手机部分。
二、Fragment优势
从上面的例子知道,Fragment在开发中非常重要。概括起来,使用Fragment有以下一些好处:
- Fragment可以将Activity分离成多个可重用的组件,每个都有它自己的生命周期和UI。
- Fragment可以轻松创建动态灵活的UI设计,可以适应于不同的屏幕尺寸。
- Fragment是一个独立的模块,紧紧地与Activity绑定在一起。可以运行中动态地移除、加入、交换等。
- Fragment提供一个新的方式让我们在不同的安卓设备上统一UI。
- Fragment 可以解决Activity间的切换不流畅,轻量切换问题。
- Fragment 可以替代TabActivity做导航,性能更好。
- Fragment 在4.2.版本中新增了嵌套Fragmeng的使用方法,能够生成更好的界面效果。
- Fragment做局部内容更新更方便,原来为了达到这一点要把多个布局放到一个Activity里面,现在可以用多Fragment来代替,只有在需要的时候才加载Fragment,大大提高了性能。
三、Fragment使用
与创建Activity类似,要创建一个Fragment必须创建一个类继承自Fragment。
很多时候我们都是直接重写Fragment,其实Fragment类是一个基类,还有几个派生子类,Fragment的继承关系如下图所示。
● DialogFragment
显示一个浮动的对话框。使用这个类创建对话框是替代Activity创建对话框的最佳选择。因为可以把fragmentdialog放入到Activity的返回栈中,使用户能再返回到这个对话框。
● ListFragment
显示一个列表控件,就像ListActivity类,它提供了很多管理列表的方法,比如onListItemClick()方法响应click事件。
● PreferenceFragment
显示一个由Preference对象组成的列表,与PreferenceActivity相同。它用于为程序创建“设置”Activity。
● WebViewFragment
WebViewFragment封装了WebView,随着WebViewFragment的暂停或恢复,WebView也进入暂停或恢复状态。
创建时可以根据需要使用Fragment基类或它的任意子类。为了控制Fragment显示的组件,通常需要重写onCreateView()方法,该方法返回的View 将作为该Fragment显示的View组件,当Fragment绘制界面组件时将会回调该方法。
需要注意的是,Android系统提供了两个Fragment类,分别是android.app.Fragment和 android.support.v4.app.Fragment。其中继承 android.app.Fragment 类则程序只能兼容 Android 4.0 以上的系统,继承android.support.v4.app.Fragment类可以兼容低版本的Android系统。
接下来通过一段示例代码来演示如何创建Fragment,首先创建一个布局文件,里面只有一个文本框,代码如下:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:background="#1fc186" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical">
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#0b0faf" android:textSize="18sp" android:text="这是我的第一个Fragment" />
</LinearLayout>
接下来创建我们的第一个Fragment,并让其继承Fragment,代码如下:
public class FirstFragment extends Fragment {
@Nullable @Override protected View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_first, container, false); return view; }}
上述代码重写了 Fragment的onCreateView()方法,并在该方法中调用了 Layoutlnflater的 inflate()方法加载了布局文件,并返回该布局文件对应的View组件。
Fragment创建完成后并不能单独使用,还需要将Fragment加载到Activity中,具体方法下一期继续学习。
- GO语言标准库概览
- 关于自动化平台的动态菜单设计
- go语言网络编程之tcp
- 实现简单的http并发请求,支持:GET、POST、HEAD、PUT
- 【go语言】Goroutines 并发模式(一)
- 【go语言】Goroutines 并发模式(二)
- 从零开始搭建Nginx和Tomcat的web集群环境
- 【翻译】为什么 goroutine 的栈内存无穷大?
- 从PowerVM,KVM到Docker:存储池的配置与调优---第一篇终结(第3子篇)
- goroutine背后的系统知识
- 从PowerVM,KVM到Docker:存储池的配置与调优---第一篇(第2子篇)
- 2017最后一天的学习-TensorFlow
- 从PowerVM,KVM到Docker:存储池的配置与调优---第一篇(第1子篇)
- 36小时,造一个亚马逊无人商店 | 实战教程+代码
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- dubbo学习之源码创建属于自己的dubbo-demo
- Vue4.x配置env开发环境、测试环境、生产环境
- SpringBoot总结之CommandLineRunner
- 详细整理Spring事务失效的具体场景及解决方案
- Vue监听文本框实时输入限制输入长度
- 30 分钟轻松搞定正则表达式基础
- Vant引入CDN实现图片懒加载
- Js时间戳倒计时天时分秒
- 微信小程序引用we-cropper裁切图片
- NodeJs获取get/post传值
- Mybatis源码本地化构建Demo
- NodeJs封装静态web服务器、路由、读取文件获取响应类型
- NodeJs使用ejs模板引擎实现后端渲染
- 如何优雅地本地化构建Mybatis源码
- Vue监听返回键关闭弹出层不返回页面