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

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.

相关推荐
热点推荐
外交部:中方对巴拉圭和伯利兹个别政客加以惩戒,以儆效尤

外交部:中方对巴拉圭和伯利兹个别政客加以惩戒,以儆效尤

澎湃新闻
2026-10-12 15:28:26
央视直播,北京双雄!国安迎战青岛西海岸,首钢对长白山,同播泰山浙江

央视直播,北京双雄!国安迎战青岛西海岸,首钢对长白山,同播泰山浙江

实事球是
2026-10-12 18:01:15
苏州一对情侣,谈了7年,女子提了18次分手,分手后在街头痛哭!

苏州一对情侣,谈了7年,女子提了18次分手,分手后在街头痛哭!

川渝视觉
2026-04-17 22:13:14
出轨女子第二波聊天记录曝光,虎狼之词惊呆吃瓜网友,她嫌丢人开始批量投诉了

出轨女子第二波聊天记录曝光,虎狼之词惊呆吃瓜网友,她嫌丢人开始批量投诉了

汉史趣闻
2026-09-01 17:55:01
知名学者万逢义回国出任浙江大学求是讲席教授

知名学者万逢义回国出任浙江大学求是讲席教授

澎湃新闻
2026-10-12 14:10:28
“希望4个老人长命百岁”,女子晒3万多退休金,普通人的心却凉了

“希望4个老人长命百岁”,女子晒3万多退休金,普通人的心却凉了

番外行
2026-09-22 16:10:14
她是国家一级演员,多次给坐轮椅的丈夫戴绿帽,丈夫为何不愿离婚

她是国家一级演员,多次给坐轮椅的丈夫戴绿帽,丈夫为何不愿离婚

历史点行
2026-10-11 08:30:13
C罗赛后未领MVP奖杯被批“缺乏尊重”,沙媒:他因回更衣室理疗缺席

C罗赛后未领MVP奖杯被批“缺乏尊重”,沙媒:他因回更衣室理疗缺席

大风新闻
2026-10-11 19:13:14
杨子离婚 3个月就和新欢产子,黄圣依17年青春喂了狗,体面尽失

杨子离婚 3个月就和新欢产子,黄圣依17年青春喂了狗,体面尽失

橙星文娱
2026-04-29 10:30:58
十年换了无数天价珠宝,没一次赢过刘亦菲的脸,宝格丽彻底服了

十年换了无数天价珠宝,没一次赢过刘亦菲的脸,宝格丽彻底服了

流云随风去远方
2026-07-31 19:44:34
明晚开播!湖南卫视新剧预约破300万,阵容太猛了

明晚开播!湖南卫视新剧预约破300万,阵容太猛了

陈意小可爱
2026-10-12 14:24:03
日本最后的心理防线被击穿了,它的恐惧已经到了顶点

日本最后的心理防线被击穿了,它的恐惧已经到了顶点

一个坏土豆
2026-09-27 19:12:26
中纪委动真格!公职人员下班后的饭局,有5种情况将严肃处理!

中纪委动真格!公职人员下班后的饭局,有5种情况将严肃处理!

职场资深秘书
2026-10-09 19:26:53
国乒大满贯共248 万奖金:王曼昱 71 万,陈幸同 22 万,孙颖莎拿

国乒大满贯共248 万奖金:王曼昱 71 万,陈幸同 22 万,孙颖莎拿

兵鉴史
2026-10-12 17:58:52
iPhone 20 Pro Max突然反转,真全面屏没了

iPhone 20 Pro Max突然反转,真全面屏没了

搞机小帝
2026-10-10 18:08:46
陈梦、丁宁看台见证,王曼昱夺冠后国乒全队起立鼓掌!陈梦穿搭休闲低调,戴着帽子,十分低调

陈梦、丁宁看台见证,王曼昱夺冠后国乒全队起立鼓掌!陈梦穿搭休闲低调,戴着帽子,十分低调

开成运动会
2026-10-11 23:18:53
轻松一刻:怎么判断一个男性聪不聪明?

轻松一刻:怎么判断一个男性聪不聪明?

莱月昂
2026-10-12 18:01:24
俄媒:“风暴阴影”袭击致20名俄军官死亡,创已知单次最多

俄媒:“风暴阴影”袭击致20名俄军官死亡,创已知单次最多

桂系007
2026-10-10 09:25:31
中国电网负债3万亿,外媒称百年难回本

中国电网负债3万亿,外媒称百年难回本

梦想的现实
2026-07-01 01:11:56
王曼昱从北京带走95万大奖,重回世界第一,没想到孙颖莎不到10万

王曼昱从北京带走95万大奖,重回世界第一,没想到孙颖莎不到10万

曹说体育
2026-10-12 10:37:59
2026-10-12 19:00:49
徐公码字
徐公码字
90后程序员,不一样的世界
1文章数 3关注度
往期回顾 全部

科技要闻

尊界:10月底确认制动踏板支架升级方案

头条要闻

8千元小狗遭仅退款 商家驱车600公里上门顾客称狗已死

头条要闻

8千元小狗遭仅退款 商家驱车600公里上门顾客称狗已死

体育要闻

一周吃6顿披萨的胖子,也能单防姆巴佩?

娱乐要闻

张艺谋身体状况曝光 陈婷不再顾及体面

财经要闻

尊界,是江淮的救命车还是失血引擎?

汽车要闻

全新smart精灵2号来了 两门两座 传承经典纯电进化

态度原创

艺术
家居
手机
本地
公开课

艺术要闻

胖东来梦之城工地成教科书!按规矩干,咋就这么难?

家居要闻

2026建博会(广州) 公装联探展交流活动

手机要闻

华为新子品牌、Air、麒麟全系芯片、手机将全面回归

本地新闻

踏访沙县第一村,寻国民小吃本源

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版