最近在降低项目总体错误率,发现有一些dialogFragment报了几个active、already added的错误,就修复了一波.

Fragment already active

这是Fragment调用setArguments()方法时报的错误.原因是当Android堆栈正在删除Fragment而删除操作没有完成时,也就是Fragment仍保持active又被重新调用了setArguments()方法,常见操作是快速连续点击调用这个Fragment的操作.
解决方法:使用Fragment的isRemoving()方法来判断该Fragment是否还存在堆栈中,如果true,那么Fragment依然active,那么可以采取复写相同地址下的Arguments来解决;如果false,那么说明Fragment not active,可以直接调用setArguments()见下面代码.

if (fragment.isRemoving()) {    fragment.getArguments().putAll(bundle);} else {    fragment.setArguments(bundle);}

如果是全局的dialogfragment,可以通过判断dialogFragment是否为null来设置.

Fragment already added

出现场景:
Fragment:快速双击调用FragmentTransaction.add()方法添加fragment,而fragment不是每次单独生成的,就会引起这个异常。
DialogFragment:快速点击呼起dialogFragment的按钮,因为
DialogFragment.show()内部调用了FragmentTransaction.add()方法,所以调用DialogFragment.show()方法时候也可能会出现这个异常。
解决方法:
Fragment:在add()方法时候,先判断fragmentA.isAdded(),如下调用可以避免该异常:

if(!fragmentA.isAdded()){        FragmentManager manager =getFragmentManager();        FragmentTransaction ft = manager.beginTransaction();        ft.add(fragment, "tag");        ft.commit();}

DialogFragment:重写show方法,根据tag来获取fragment进行判断.

@Overridepublic void show(FragmentManager manager, String tag) {    Fragment fragment = manager.findFragmentByTag(tag);    if (fragment == null || !fragment.isAdded()) {        super.show(manager, tag);    }}

Fragment MyFragment not attached to Activity

出现该异常,是因为Fragment的还没有Attach到Activity时,调用了如getResource()等需要上下文Context的方法。
解决方法:
1.将调用的这些方法写在OnStart()中。
2.在调用:getResources().getString(R.xx.xxx); 之前增加一个判断isAdded();

不喜请轻喷,毕竟我是一个渣渣.
个人简书地址:http://www.jianshu.com/u/976bb1f8fc7b

更多相关文章

  1. Android(安卓)ART Hook & 注入实现细节
  2. Android(安卓)UI开发详解之ActionBar
  3. android四种点击事件触发写法
  4. Android-NDK开发之基础--Android(安卓)JNI实例代码(一)-- 在JNI
  5. 修改Android模拟器的system分区,以及加入SuperSU
  6. 浅谈android IOC控制反转二(事件篇)
  7. Android(安卓)NDK用法
  8. Android视频播放时停止后台运行的方法
  9. 帅气的属性动画赏析(Property Animation)

随机推荐

  1. <JVM下篇:性能监控与调优篇>补充:使用OQL语
  2. 负载均衡概念入门
  3. 微信小程序介绍、配置、视图层、逻辑层、
  4. 互动网站建设,如何操作,海量模板一站式建站
  5. <JVM下篇:性能监控与调优篇>04-JVM运行时
  6. 实例演绎php遍历数组与js遍历数组的区别
  7. <JVM下篇:性能监控与调优篇>05-分析GC日志
  8. <JVM中篇:字节码与类的加载篇>02-字节码指令
  9. PHP编程0804作业
  10. <JVM上篇:内存与垃圾回收篇>01-JVM与Java