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

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.

相关推荐
热点推荐
离过年不到2月,52岁辛柏青高调传出喜讯,朱媛媛终于可以放心了

离过年不到2月,52岁辛柏青高调传出喜讯,朱媛媛终于可以放心了

涵豆说娱
2026-01-14 16:26:28
每周死机3次,还疯狂偷数据?一名程序员的Linux迁徙记:“我终于把Win11删光了”

每周死机3次,还疯狂偷数据?一名程序员的Linux迁徙记:“我终于把Win11删光了”

CSDN
2026-01-12 19:32:46
留给大清的时间,真的不多了

留给大清的时间,真的不多了

我是历史其实挺有趣
2026-01-03 08:50:37
上了中学回头看,给孩子最好的营养剂,第一是阅读,第二是运动,第三你想不到……

上了中学回头看,给孩子最好的营养剂,第一是阅读,第二是运动,第三你想不到……

十点读书
2026-01-13 19:02:58
伊朗组织:有大规模处决示威者的危险,国际社会有责任保护平民

伊朗组织:有大规模处决示威者的危险,国际社会有责任保护平民

一种观点
2026-01-13 08:32:19
丹麦羽球选手炮轰印度公开赛:场地又脏又臭担心染病,到处是鸟粪

丹麦羽球选手炮轰印度公开赛:场地又脏又臭担心染病,到处是鸟粪

杨华评论
2026-01-14 03:13:17
豪门下课不愁下家!欧洲三大名帅各有新归宿,离任无忧底气十足!

豪门下课不愁下家!欧洲三大名帅各有新归宿,离任无忧底气十足!

田先生篮球
2026-01-13 14:01:53
最不该反的人,反了

最不该反的人,反了

我是历史其实挺有趣
2025-11-22 08:46:10
美国在中东现在兵力几何?沙特官员已承诺:不会向美开放领空

美国在中东现在兵力几何?沙特官员已承诺:不会向美开放领空

红星新闻
2026-01-14 17:55:38
央媒曝光!你买的儿童电话手表,正在悄悄毁掉你的孩子!

央媒曝光!你买的儿童电话手表,正在悄悄毁掉你的孩子!

徐德文科学频道
2026-01-14 15:09:47
上海银行行长选妃:腿要长,腰要细,皮肤要白,各个对其死心塌地

上海银行行长选妃:腿要长,腰要细,皮肤要白,各个对其死心塌地

凯裕说故事
2025-01-10 10:48:42
中戏辟谣后,闫学晶儿子又被举报了,如今央媒下场,这下麻烦大了

中戏辟谣后,闫学晶儿子又被举报了,如今央媒下场,这下麻烦大了

叨唠
2026-01-14 04:47:42
他汀立新功!研究发现:这3种他汀不仅不伤肝,还能降低肝癌风险

他汀立新功!研究发现:这3种他汀不仅不伤肝,还能降低肝癌风险

岐黄传人孙大夫
2026-01-13 10:48:53
日本发现原版吴三桂反叛檄文,揭开降清原因:难怪清廷要抹黑他

日本发现原版吴三桂反叛檄文,揭开降清原因:难怪清廷要抹黑他

掠影后有感
2025-12-25 12:43:41
被中年阿姨的5个“家务妙招”拆服了,换个思路,家务立马减半!

被中年阿姨的5个“家务妙招”拆服了,换个思路,家务立马减半!

家居设计师苏哥
2025-12-27 14:32:15
人民日报发文,王欣瑜再破天花板,让郑钦文和整个网球界沉默了

人民日报发文,王欣瑜再破天花板,让郑钦文和整个网球界沉默了

圆梦的小老头
2026-01-13 20:05:07
撤换吴宗宪?郑丽文最新任命曝光,张亚中被重用,侯友宜直接露馅

撤换吴宗宪?郑丽文最新任命曝光,张亚中被重用,侯友宜直接露馅

坠入二次元的海洋
2026-01-14 06:00:12
网传武汉周边房价低至5万一套,马云诅咒的白菜价真的要来了?

网传武汉周边房价低至5万一套,马云诅咒的白菜价真的要来了?

慧翔百科
2026-01-14 09:09:00
仅差1篮板又刷纪录!41岁詹皇31+10+9结束三连败 末节12分真猛

仅差1篮板又刷纪录!41岁詹皇31+10+9结束三连败 末节12分真猛

颜小白的篮球梦
2026-01-14 13:51:28
特朗普通报全球,他带领美国赢了中国!话音刚落,中方对美征关税

特朗普通报全球,他带领美国赢了中国!话音刚落,中方对美征关税

素年文史
2026-01-14 16:48:24
2026-01-14 20:03:00
徐公码字
徐公码字
90后程序员,不一样的世界
1文章数 1关注度
往期回顾 全部

科技要闻

携程因涉嫌垄断被市场监管总局调查

头条要闻

男子驾车撞死一家三口获死缓 被害人家属递交抗诉申请

头条要闻

男子驾车撞死一家三口获死缓 被害人家属递交抗诉申请

体育要闻

你是个好球员,我们就拿你交易吧

娱乐要闻

何晴去世30天,许亚军终于发声

财经要闻

涉嫌垄断!市场监管总局对携程立案调查

汽车要闻

曝Model Y或降到20万以内!

态度原创

亲子
艺术
数码
教育
公开课

亲子要闻

孩子尿道下裂,家长如何缓解焦虑?

艺术要闻

八大山人『山水花鸟册』

数码要闻

创作者福音!这台笔记本让“既要又要”成为可能

教育要闻

牛津放榜!北京斩获20枚offer!多所黑马校杀出

公开课

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

无障碍浏览 进入关怀版