Fragment报错记录
最近维护的项目里bugly中fragment报了几种错误,记录一下:
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,可以通过判断fragment是否为null来设置。
Fragment already added
出现场景: Fragment:快速双击调用FragmentTransaction.add()或者DialogFragment.show()方法添加fragment,而fragment不是每次单独生成的,就会引起这个异常。
原因: fragment不是每次单独生成的,就会引起这个异常;show()内部调用了FragmentTransaction.add()方法。
解决方法: 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();
Can not perform this action after onSaveInstanceSate
原因: 用户在onSaveInstanceState期间操作了fragment,比如后退,切换操作等
解决办法: commitAllowingStateLoss()去代替commit()
更多相关文章
- 获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图
- Android(安卓)Handler消息机制中的ThreadLocal源码分析
- android 初始化时获得控件位置,宽高的属性
- Android显式intent和隐式intent
- Android(安卓)AysncTask 从源码角度简单理解它的使用限制原因
- Android(安卓)中Service组件
- 黑马程序员12——android之事件传播机制
- Android培训班(83)Dalvik虚拟机的初始化
- android Debug调试