部分内容来源于别人的总结,如有冒犯侵权,请告知! 邮箱:simoncqhy@163.com.谢谢!我只想做一个记录,以免自己以后出现不知道怎么解决.
Fragmentation库:非常适合单Activity+多Fragment 或者 多模块Activity+多Fragment的架构
特性
1、快速开发出各种嵌套设计的Fragment App
2、实时查看Fragment的(包括嵌套Fragment)栈视图的对话框和Log,方便调试
3、增加启动模式、startForResult等类似Activity方法
4、类似Android事件分发机制的Fragment回退方法:onBackPressedSupport(),轻松为每个Fragment实现Back按键事件
5、New!!! 提供onSupportVisible()等生命周期方法,简化嵌套Fragment的开发过程; 提供统一的onLazyInitView()懒加载方法
6、提供靠谱的 Fragment转场动画 的解决方案
7、更强的兼容性, 解决多点触控、重叠等问题
8、支持SwipeBack滑动边缘退出(需要使用Fragmentation_SwipeBack库,
在使用fragment的过程中,我相信大家都遇到很多坑,在开发中,虽然谷歌推出了碎片化处理,但是里面本身还有很多bug.
在开发中最容易出现的bug如下:
1、getActivity()空指针
2、异常:Can not perform this action after onSaveInstanceState
3、Fragment重叠异常-----正确使用hide、show的姿势
4、Fragment嵌套的那些坑
5、未必靠谱的出栈方法remove()
6、多个Fragment同时出栈的深坑BUG
7、深坑 Fragment转场动画
getActivity()空指针
可能你遇到过getActivity()返回null,或者平时运行完好的代码,在“内存重启”之后,调用getActivity()的地方却返回null,报了空指针异常。
大多数情况下的原因:你在调用了getActivity()时,当前的Fragment已经onDetach()了宿主Activity。
比如:你在pop了Fragment之后,该Fragment的异步任务仍然在执行,并且在执行完成后调用了getActivity()方法,这样就会空指针。
解决方案:
在Fragment基类里设置一个Activity mActivity的全局变量,在onAttach(Activity activity)里赋值,使用mActivity代替getActivity(),保证Fragment即使在onDetach后,仍持有Activity的引用(有引起内存泄露的风险,但是异步任务没停止的情况下,本身就可能已内存泄漏,相比Crash,这种做法“安全”些)即:
protected Activity mActivity;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
this.mActivity = activity;
}
/**
如果你用了support 23的库,上面的方法会提示过时,有强迫症的小伙伴,可以用下面的方法代替
*/
@Override
public void onAttach(Context context) {
super.onAttach(context);
this.mActivity = (Activity)context;
}
异常:Can not perform this action after onSaveInstanceState
在你离开当前Activity等情况下,系统会调用onSaveInstanceState()帮你保存当前Activity的状态、数据等,直到再回到该Activity之前(onResume()之前),你使用commit()提交了Fragment事务,就会抛出该异常!
解决方法2个:
1、(不推荐)该事务使用commitAllowingStateLoss()方法提交,但是有可能导致该次提交无效!(在此次离开时恰巧Activity被强杀时)
2、(推荐)在重新回到该Activity的时候(onResumeFragments()或onPostResume()),再执行该事务!
Fragment重叠异常-----正确使用hide、show的姿势和replace(坑相对来说要少些)
原因是FragmentManager帮我们管理Fragment,当发生“内存重启”,他会从栈底向栈顶的顺序一次性恢复Fragment;
但是因为没有保存Fragment的mHidden属性,默