【基础07】用 Fragment 管理 View

322 阅读3分钟

这是我参与8月更文挑战的第8天,活动详情查看:8月更文挑战

昨天身体不太舒服,早早睡了,断更一天。今天不继续将 View 的绘制了,先补充一个实践中涉及到的重要知识:Fragment。

为什么要有 Fragment

现状:动态化 View 的需求存在

之前我们一直使用 xml 直接搭建 UI,好处是思路清晰、可预览可复用,缺点是不够灵活

比如说 Activity 的一个区域在使用过程中会显示不同内容,我们可以通过 FrameLayout 移除和添加 View 实现。

现状:View 与 Activity 生命周期必须绑定

再回顾一下,跳转页面的代码我们用 Intent 去启动新的 Activity,因为 Activity 的管理是 Android 系统直接负责的,我们只能在一些回调函数(比如 onCreate)中自定义 Activity 的内容。

View 存在于 Activity 中,也需要响应 Activity 的生命周期,至少要保证 View 对象的存活时间不会超过对应的 Activity,否则就会内存泄漏

解决方案:Fragment 是一种特殊的自定义 View

自定义 View 在 Android 中一般是指继承 View 实现自己的绘制策略,以后关于 UI 绘制的进阶内容会细说。

Fragment 是针对以上两种现状的一个解决方案,Fragment 做了两件事,一是内部设置了 onCreateView 和 onDestroyView 给了 View 对象明确的存在范围,二是通过 FragmentManager 添加或移除,把 Fragment 自身绑定在 Activity 上。

从结果上看,Fragment 可以像 View 一样,给它数据能绘制到屏幕上。从使用方法上看,Fragment 跟 Activity 比较相似。接下来就写一个试试吧。

再看 ColorFragment

ColorFragment 是前两篇中 Demo 的调试 Fragment,今天的 Demo 部分就来讲一下它的内容。

先回顾一下长什么样:

scr0807.gif

scr0806.gif

颜色鲜艳的部分就是 Fragment 的区域。ColorFragment 接收一个颜色参数,将字符串显示在正中间并将背景设置为对应颜色。

首先是创建一个被 Fragment 管理的 View,依然采取 xml 搭建。

image.png

然后创建 Fragment 并加载 xml 的 View,也就是重写 onCreateView 函数。

image.png

仿写掘金 App 的实践部分使用了 ViewBinding,原理是一样的。

最后是处理输入的参数,Fragment 的生命周期由绑定的 Activity 控制,也就是由系统直接控制,所以创建和销毁都不在我们开发者的掌控之中,无论是使用构造函数还是使用 setter 都无法保证传进来的参数是可靠的,这里必须使用 arguments 注入数据。

image.png

使用数据也需要从 arguments 取值,这样当 Fragment 被系统销毁重建之后就不会丢数据了。完整代码见 Github


实践部分超乎想象地难写,想在细节上尽量满足跟掘金 App 完全一致还是需要一些工作量的,满勤是没办法啦,争取28天吧。

这周内陆续做好实践的代码,周末只写文章应该就好了,所以 Github 上会带有一些多出来的仿掘金 App 代码,看 Demo 的时候忽略就好了。

快七夕了,大家想好礼物了吗?球球过来人给我点建议吧!