网易首页 > 网易号 > 正文 申请入驻

Fragment全解析系列-正确的使用姿势

0
分享至

前言

本文转载自 Yokey,分享了Fragment 那些年走过的坑,非常精彩,相信对大家有所帮助。

Yokey的博客地址

https://www.jianshu.com/u/6b372d09b617

本篇主要介绍一些Fragment使用技巧。

Fragment是可以让你的app纵享丝滑的设计,如果你的app想在现在基础上 性能大幅度提高 ,并且 占用内存降低
,同样的界面Activity占用内存比Fragment要多,响应速度Fragment比Activty在中低端手机上快了很多,甚至能达到好几倍!如果你的app当前或以后有
移植 平板等平台时,可以让你节省大量时间和精力。

简陋的目录
1、一些使用建议
2、add(), show(), hide(), replace()的那点事
3、关于FragmentManager你需要知道的
4、使用FragmentPagerAdapter+ViewPager的注意事项
5、是使用单Activity+多Fragment的架构,还是多模块Activity+多Fragment的架构?

作为一个稳定的app,从后台且回到前台,一定会在任何情况都能恢复到离开前的页面,并且保证数据的完整性。

如果你没看过本系列的[第一篇](),为了方便后面文章的介绍,先规定一个“术语”,安卓app有一种特殊情况,就是
app运行在后台的时候,系统资源紧张的时候导致把app的资源全部回收(杀死app的进程),这时把app再从后台返回到前台时,app会重启。这种情况下文简称为:“内存重启”。(屏幕旋转等配置变化也会造成当前Activity重启,本质与“内存重启”类似)

1、一些使用建议

1、对Fragment传递数据,建议使用setArguments(Bundle args),而后在onCreate中使用getArguments()取出,在
“内存重启”前,系统会帮你保存数据,不会造成数据的丢失。和Activity的Intent恢复机制类似。

2、使用newInstance(参数) 创建Fragment对象,优点是调用者只需要关系传递的哪些数据,而无需关心传递数据的Key是什么。

3、如果你需要在Fragment中用到宿主Activity对象,建议在你的基类Fragment定义一个Activity的全局变量,在onAttach中初始化,这不是最好的解决办法,但这可以有效避免一些意外Crash。详细原因参考第一篇的“getActivity()空指针”部分。

1protected Activity mActivity;
2@Override
3public void onAttach(Activity activity) {
4 super.onAttach(activity);
5 this.mActivity = activity;
6}

2、add(), show(), hide(), replace()的那点事


1、区别
show(),hide()最终是让Fragment的View setVisibility(true还是false),不会调用生命周期;

replace()的话会销毁视图,即调用onDestoryView、onCreateView等一系列生命周期;

add()和 replace()不要在同一个阶级的FragmentManager里混搭使用。

2、使用场景
如果你有一个很高的概率会再次使用当前的Fragment,建议使用show(),hide(),可以提高性能。

在我使用Fragment过程中,大部分情况下都是用show(),hide(),而不是replace()。

注意:如果你的app有大量图片,这时更好的方式可能是replace,配合你的图片框架在Fragment视图销毁时,回收其图片所占的内存。

3、onHiddenChanged的回调时机
当使用add()+show(),hide()跳转新的Fragment时,旧的Fragment回调onHiddenChanged(),不会回调onStop()等生命周期方法,而新的Fragment在创建时是不会回调onHiddenChanged(),这点要切记。

4、Fragment重叠问题
使用show(),hide()带来的一个问题就是,如果你不做任何额外处理,在“内存重启”后,Fragment会重叠;(该BUG在support-v4
24.0.0+以上 官方已修复)

有些小伙伴可能就是为了避免Fragment重叠问题,而选择使用replace(),但是使用show(),hide()时,重叠问题很简单解决的:

  • 如果你在用24.0.0+的版本,不需要特殊处理,官方已经修复该BUG;

  • 如果你在使用小于24.0.0以下的v4包,可以参考9行代码让你App内的Fragment对重叠说再见

3、关于FragmentManager你需要知道的


FragmentManager栈视图:
(1)每个Fragment以及宿主Activity(继承自FragmentActivity)都会在创建时,初始化一个FragmentManager对象,处理好Fragment嵌套问题的关键,就是理清这些不同阶级的栈视图。

下面给出一个简要的 关系图 :

栈关系图.png

(2)对于宿主Activity,getSupportFragmentManager()获取的FragmentActivity的FragmentManager对象;

对于Fragment,getFragmentManager()是获取的是父Fragment(如果没有,则是FragmentActivity)的FragmentManager对象,而getChildFragmentManager()是获取自己的FragmentManager对象。

4、使用FragmentPagerAdapter+ViewPager的注意事项

  • 使用FragmentPagerAdapter+ViewPager时,切换回上一个Fragment页面时(已经初始化完毕),不会回调任何生命周期方法以及onHiddenChanged(),只有setUserVisibleHint(boolean isVisibleToUser)会被回调,所以如果你想进行一些懒加载,需要在这里处理。

  • 在给ViewPager绑定FragmentPagerAdapter时,
    new FragmentPagerAdapter(fragmentManager)的FragmentManager,一定要保证正确,如果ViewPager是Activity内的控件,则传递getSupportFragmentManager(),如果是Fragment的控件中,则应该传递getChildFragmentManager()。只要记住ViewPager内的Fragments是当前组件的子Fragment这个原则即可。

  • 你不需要考虑在“内存重启”的情况下,去恢复的Fragments的问题,因为FragmentPagerAdapter已经帮我们处理啦。

5、是使用单Activity+多Fragment的架构,还是多模块Activity+多Fragment的架构?


单Activity+多Fragment:
一个app仅有一个Activity,界面皆是Frament,Activity作为app容器使用。

缺点:逻辑比较复杂,尤其当Fragment之间联动较多或者嵌套较深时,比较复杂。

多模块Activity+多Fragment:
一个模块用一个Activity,比如
1、登录注册流程:
LoginActivity + 登录Fragment + 注册Fragment + 填写信息Fragment + 忘记密码Fragment
2、或者常见的数据展示流程:
DataActivity + 数据列表Fragment + 数据详情Fragment + …


权衡利弊,我认为多模块Activity+多Fragment是最合适的架构,开发起来不是很复杂,app的性能又很高效。

当然。 Fragment只是官方提供的灵活组件,请优先遵从你的项目设计!
真的特别复杂的界面,或者单个Activity就可以完成一个流程的界面,使用Activity可能是更好的方案。

最后

如果你读完了第一篇和这篇文章,那么我相信你使用多模块Activity+多Fragment的架构所遇到的坑,大部分都应该能找到解决办法。

但是如果流程较为复杂,比如Fragment A需要启动一个新的Fragment
B并且关闭当前A,或者A启动B,B在获取数据后,想在返回到A时把数据交给A(类似Activity的startActivityForResult),又或者你保证在Fragment转场动画的情况下,使用pop(tag\id)从栈内退出多个Fragment,或者你甚至想Fragment有一个类似Activity的SingleTask启动模式,那么你可以参考下一篇,我的解决方案库,Fragmentation。它甚至提供了一个让你在开发时,可以随时查看所有阶级的栈视图的UI界面。

Android 面试必备 - http 与 https 协议

Android 面试必备 - 计算机网络基本知识(TCP,UDP,Http,https)

Android 面试必备 - 线程

Android 面试必备 - JVM 及 类加载机制

Android 面试必备 - 系统、App、Activity 启动过程

致刚入职场的你 - 程序员的成长笔记

干起来,你就超过了 50% 的人

一个程序员的五年总结,给你不一样的角度

stormjun94

扫一扫,欢迎关注我的公众号 stormjun94。如果你有好的文章,也欢迎你的投稿。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
官宣!19岁后卫放弃中国籍加入日本籍 名记:国足没弄过来太可惜

官宣!19岁后卫放弃中国籍加入日本籍 名记:国足没弄过来太可惜

念洲
2026-04-24 20:32:55
突破台湾问题红线!李在明彻底暴露?中方绝不惯着,王毅推迟访韩

突破台湾问题红线!李在明彻底暴露?中方绝不惯着,王毅推迟访韩

万物知识圈
2026-04-24 12:03:36
蔡琳带儿子搬离住了4年的别墅,哭着与邻居告别,光化妆品就装3车

蔡琳带儿子搬离住了4年的别墅,哭着与邻居告别,光化妆品就装3车

八怪娱
2026-04-24 15:18:26
浙江大学医学院附属第一医院十大“王牌医生”,重病难病就医收藏

浙江大学医学院附属第一医院十大“王牌医生”,重病难病就医收藏

今日养生之道
2026-04-24 18:24:33
大理民宿市场凉透了!7000家民宿厮杀,有人亏百万仍没卖出去…

大理民宿市场凉透了!7000家民宿厮杀,有人亏百万仍没卖出去…

火山詩话
2026-04-23 09:14:07
“乌龙法规”引发关注,央媒:“空气法”荒唐剧映照形式主义积弊

“乌龙法规”引发关注,央媒:“空气法”荒唐剧映照形式主义积弊

澎湃新闻
2026-04-23 19:07:04
红得快,凉得也快的6位明星,以前是男神女神,现在“无人问津”

红得快,凉得也快的6位明星,以前是男神女神,现在“无人问津”

TVB的四小花
2026-04-24 19:34:44
八千里路云和月:直到张云旗成乞丐,才懂田家泰给丁玉娇30万遗产

八千里路云和月:直到张云旗成乞丐,才懂田家泰给丁玉娇30万遗产

慢半拍sir
2026-04-24 23:07:35
上海残阵都能掀翻山东!8人轮换各个发挥,这阵容厚度太恐怖了!

上海残阵都能掀翻山东!8人轮换各个发挥,这阵容厚度太恐怖了!

篮球资讯达人
2026-04-24 23:39:49
太可怕了!继注射药物、热巴事件后,王阳再揭娱乐圈最脏的一面

太可怕了!继注射药物、热巴事件后,王阳再揭娱乐圈最脏的一面

橙星文娱
2026-04-17 13:19:56
华谊兄弟正式破产

华谊兄弟正式破产

新浪财经
2026-04-24 16:12:14
震惊!大学教师分享女儿留学与欧洲旅行见闻被举报!网友:活该吧

震惊!大学教师分享女儿留学与欧洲旅行见闻被举报!网友:活该吧

火山詩话
2026-04-24 09:20:07
6亿成本拖9年,《美人鱼2》难产,华谊申请破产,周星驰也很无奈

6亿成本拖9年,《美人鱼2》难产,华谊申请破产,周星驰也很无奈

八卦南风
2026-04-24 17:50:24
军绿紧身裙:那不是制服,是我的战袍

军绿紧身裙:那不是制服,是我的战袍

疾跑的小蜗牛
2026-04-24 20:59:30
郑钦文霸气逆转!3连胜前澳网冠军 重夺中国1姐宝座 下轮约战莱巴

郑钦文霸气逆转!3连胜前澳网冠军 重夺中国1姐宝座 下轮约战莱巴

我爱英超
2026-04-24 19:15:22
美国又赢了!简直就是赢麻了!赢疯了!赢崩了!赢傻了!

美国又赢了!简直就是赢麻了!赢疯了!赢崩了!赢傻了!

一个坏土豆
2026-04-23 19:24:17
76岁的万科创始人王石,最近彻底成了全网焦点。

76岁的万科创始人王石,最近彻底成了全网焦点。

梦录的西方史话
2026-04-23 14:36:39
后悔已来不及了,美商务部长:中方改变主意,美方想卖却卖不出去

后悔已来不及了,美商务部长:中方改变主意,美方想卖却卖不出去

混沌录
2026-04-24 15:46:15
女演员自曝:曾流产5次失去7个宝宝,如今43岁仍努力拼二胎!

女演员自曝:曾流产5次失去7个宝宝,如今43岁仍努力拼二胎!

猪小艳吖
2026-04-24 13:49:15
江苏一女子心血来潮拉出大学到工作十年账单,查出爸爸给自己转账20多万!本人瞬间破防;网友:默默付出的爸爸

江苏一女子心血来潮拉出大学到工作十年账单,查出爸爸给自己转账20多万!本人瞬间破防;网友:默默付出的爸爸

台州交通广播
2026-04-24 12:14:39
2026-04-25 03:36:49
徐公码字
徐公码字
90后程序员,不一样的世界
1文章数 1关注度
往期回顾 全部

科技要闻

DeepSeek V4牵手华为,价格依然"屠夫级"

头条要闻

欧盟公布制裁中国企业和个人名单 中方回应

头条要闻

欧盟公布制裁中国企业和个人名单 中方回应

体育要闻

上海男篮23连胜+主场全胜 姚明之后最强一季

娱乐要闻

停工16个月!赵露思证实接拍新剧

财经要闻

LG财阀内斗:百亿美元商业帝国争夺战

汽车要闻

零跑Lafa5 Ultra北京车展上市:11.88-12.48万

态度原创

健康
艺术
游戏
亲子
教育

干细胞如何让烧烫伤皮肤"再生"?

艺术要闻

世界最高20座大楼,你见过几栋?

《光与影:33号远征队》发售一周年 销量破800万

亲子要闻

小狮子也只是个大宝宝呀,看到小朋友的车车满眼羡慕

教育要闻

帝国理工IC相当于国内什么大学?

无障碍浏览 进入关怀版