这篇博客主要是从BaseActivity与BaseFragment的封装开始,总结我们在实战开发中关于Fragment的注意事项以及心得体会。

先看以下效果图:

这里模拟的是用户登录模块,你可能会说,很普通的效果嘛,这有啥。嘿嘿,那我要告诉你的是,这么多模块仅仅由两个Activity构成的。等你从头到尾看完这篇博客,你就会惊叹其中的奥秘了。废话不多说,开始。

本案例属于多模块Activity+多Fragment,下面简单介绍下概念。

多模块Activity+多Fragment 是开发APP非常适合的架构,相对于多Activity,这种架构APP占用内存降低,性能提升;相对于单Activity+多Fragment,这种开发起来逻辑相对简单,不容易出错。

对于多模块Activity+多Fragment,这里有两个概念需要我们了解一下:

  • 同级式Fragment: 比如QQ的主界面,消息,联系人,动态,这三个Fragment就属于同级关系,我们平时项目中主界面的Fragment也是属于同级Fragment
  • 流程式Fragment:比如我这个示例Demo,可以理解为用户账户流程,可以包括:登录/注册模块—-忘记/找回密码模块—-用户协议模块,这些Fragent就是属于流程式Fragment

我的示例Demo使用的是流程式Fragment,结合今天的主题—-BaseActivity与BaseFragment的封装,我们一探究竟。

BaseActivity的封装

首先看一下代码:

  1. 两个必须实现的抽象方法,获取布局文件Layout的resource ID,获取布局文件中Fragment的ID

  2. 添加fragment:开启一个事物,替换了当前layout容器中的由getFragmentContentId()标识的fragment。通过调用 addToBackStack(String tag), replace事务被保存到back stack, 因此用户可以回退事务,并通过按下BACK按键带回前一个fragment,如果没有调用 addToBackStack(String tag), 那么当事务提交后, 那个fragment会被销毁,并且用户不能导航回到它。其中参数tag将作为本次加入BackStack的Transaction的标志。commitAllowingStateLoss(),这种提交是允许发生异常时状态值丢失的情况下也能正常提交事物

  3. 移除fragment:与addToBackStack()相对应的接口方法是popBackStack(),调用该方法后会将事务操作插入到FragmentManager的操作队列,轮询到该事务时开始执行。这里进行了一下判断,获取回退栈中所有事务数量,大于1的时候,执行回退操作,等于1的时候,代表当前Activity只剩下一个Fragment,直接finish()当前Activity即可

  4. 监听返回键的返回事件,当事务数量等于1的时候,直接finish()

进一步封装AppActivity

  1. 一个必须实现的抽象方法来获取当前Activity应该显示的第一个Fragment
  2. 获取intent的方法,在需要传递/接受数据的Activity实现
  3. 在Activity的onCreate()方法中拿到intent,添加fragment

不过这样的封装是需要制定一个布局文件的,activity_base.xml布局文件代码为:

BaseFragment的封装

在APP运行在后台的时候,系统资源紧张的时候会导致后台的Activity被销毁,可能会带来一些问题,其中之一就是Fragment调用getActivity()的地方却返回null,报了空指针异常。

解决办法就是在Fragment基类里设置一个Activity mActivity的全局变量,在onAttach(Activity activity)里赋值,使用mActivity代替getActivity()。

封装后的使用

BaseActivity与BaseFragment的封装都已经完成,接下来就是具体在项目中的使用了,这里分两种情况。

  • 第一种情况:没有参数的传递

示例Demo中的主界面MainActivity,可以看到代码相当的精简,对应的MainFragment代码如下:

很简单的业务逻辑,点击第一个按钮跳转到LoginActivity,点击第二个按钮跳转到注册模块,布局文件代码就不贴了。

  • 第二种情况:有参数的传递

可以看到,LoginActivity与之前不一样的是,重写了handleIntent()这个方法来获取传递过来的数据,重要的一点,创建Fragment的时候传递了一个参数。 代码很简单,即通过Arguments传递参数。

给Fragment添加newInstance方法,将需要的参数传入,设置到bundle中,然后setArguments(bundle),最后在onCreate中进行获取。

这种使用arguments来创建Fragment的方法,强烈推荐使用:

这样就完成了Fragment和Activity间的解耦,使用Fragment的一个很大的原因,就是为了复用。这一点在我主界面点击第二个按钮跳转到注册界面有所体现
对Fragment传递数据,建议使用setArguments(Bundle args),而后在onCreate中使用getArguments()取出,在 内存不足导致异常时,系统会帮你保存数据,不会造成数据的丢失。和Activity的Intent原理一致。
使用newInstance(参数) 创建Fragment对象,优点是调用者只需要关系传递的哪些数据,而无需关心传递数据的Key是什么。

其他界面大同小异,大家可以在此自由发挥。关于流程式Fragment,就先到这里,看看同级式Fragment应该注意的问题。

hide()与show()导致的Fragment重叠

同级式Fragment在内存不足导致的异常情况下,会出现重叠现象,处理方法是在基类的Activity中onSaveInstanceState()内保存当前所在Fragment的tag或者下标,在onCreate()是恢复的时候,隐藏其它Fragment。

假设我们存在三个同级Fragment,目前Fragment为ContactFragment,此时切换到后台,由于内存因素导致Activity重建,我们就可以通过上述代码解决Fragment重叠以及回到ContactFragment页面。

当然要记得在onSaveInstanceState存储下当前页面信息

推荐阅读

  • Fragment全解析系列(一):那些年踩过的坑
  • Fragment全解析系列(二):正确的使用姿势
  • Fragment之我的解决方案:Fragmentation
  • Android Fragment 你应该知道的一切

参考链接

从BaseActivity与BaseFragment的封装谈起

BaseActivity与BaseFragment的封装相关推荐

  1. 总结界面框架_UI_Adapter

    本人定期更新经典案例及解决方案如有疑问请联系我QQ1822282728 -- 277627117   下面是常用到的ui  Demo 安卓三级筛选菜单listview(非常经典) http://dow ...

  2. 搜集整理的一些博客导航

    简介:第一次在CSDN上发表博客,将自己关注或者看过的一些博客整理了一下,其中包含了鸿神和郭神的全部博客,包括两位大神微信公众号推荐的博客,另外还有一些安卓开发社区的博客,后续每天都会更新这个导航,希 ...

  3. Android 优秀文章收集整理集合

    转载 自    https://github.com/jiang111/awesome-android-tips 记录自己遇到的比较有价值的Android相关的blog MaHua是online md ...

  4. Android 常用开发功能 博客导航

    转载地址:http://blog.csdn.net/ciqing123/article/details/52931663?locationNum=16&fps=1 简介:第一次在CSDN上发表 ...

  5. Android优秀文章收集(转载)

    http://blog.csdn.net/u010375364/article/details/52200425 http://blog.csdn.net/u010375364/article/det ...

  6. Android安卓开发知识库汇总

    初级 Android 面试知识库 Android 面试题总结之Android 进阶(二) - fuchenxuan blog - 博客频道 - CSDN.NET 如何成为一名优秀的程序员 | Myst ...

  7. android loading封装_我们经常用的Loading动画居然还有这种姿势

    背景 Loading动画几乎每个Android App中都有. 一般在需要用户等待的场景,显示一个Loading动画可以让用户知道App正在加载数据,而不是程序卡死,从而给用户较好的使用体验. 同样的 ...

  8. MVP 在项目中的最佳实战(封装篇)

    作者 夏至,欢迎转载,但请保留这段申明 blog.csdn.net/u011418943/- 说到 MVP ,大家应该都不陌生了,由于其高度解耦等优点,越来越多的项目使用这个设计模式:然而,优点虽在, ...

  9. 网络封装 - 收藏集 - 掘金

    打造安卓 App 丝滑的操作体验--Fragment 深入使用和封装之道 - Android - 掘金 简介 想让App有丝滑般的切换速度和顺畅的体验么?那就放开Activity,使用Fragment ...

最新文章

  1. 【 MATLAB 】常用的离散时间序列的 Matlab 产生
  2. 转:乐视秒杀:每秒十万笔交易的数据架构解读
  3. 请给出一个算法,使之对于给定的介于0到k之间的n个整数进行预处理,并能在O(1)时间内,回答出输入的整数中有多少个落在区间[a..b]内,你给出的算法上预处理时间应是O(n+k)。...
  4. 加减法叫做什么运算_期中备考:数学运算定律、法则与顺序
  5. python如何导入txt数据集-终于找到python入门到实践数据集
  6. Java进阶之光!java字符串类型转换为int
  7. android上传图片文件至c 服务器,Android 史上最优雅的实现文件上传、下载及进度的监听...
  8. matplotlib 绘制梯度下降求解过程
  9. android 闪存软件测试,手机为什么这么卡:闪存I/O测试AndroBench
  10. mysql + mha + keepalive + vip_MYSQL + MHA +keepalive + VIP安装配置(二)--MHA的配置
  11. Android 导入导出excel xls、xlsx
  12. 相关系数excel_怎么制作高光谱遥感数据波段间相关系数热力图
  13. 舍得网-开发问题(学习别人经验)
  14. 等额本息PMT和PPMT推导计算公式
  15. matlab 怎么打开.p文件,matlab p文件肿么打开 或者 运行
  16. R语言详解参数检验和非参数检验——样本T检验、方差分析、pearson相关性检验、单样本wilcoxon检验、Mann-Whitney检验、配对样本wilcoxon检验、列联表检验、卡方检验
  17. 中国科学家dna计算机,我国首台DNA计算机问世
  18. 当欧洲开始通过页游对抗假新闻,中国何时起步媒介素养培育?
  19. lodop打印html上下居中,lodop打印横向纵向
  20. html班级管理,谈小学班级管理

热门文章

  1. 谈谈神经网络的大规模训练优化
  2. Storm 的可靠性保证测试
  3. 论文浅尝 | 基于用户反馈的交互式自然语言回答系统提升机制
  4. 论文浅尝 | 基于RNN与相似矩阵CNN的知识库问答
  5. Bert/Transformer汇总
  6. 采用优化卷积神经网络的红外目标识别系统
  7. leetcode-187-重复的DNA序列
  8. Reparameterization Trick
  9. mysql 字段唯一性问题
  10. DOM查找元素的方法总结