Fragment使用中遇到的异常

来源:互联网 发布:网易上海房产成交数据 编辑:程序博客网 时间:2024/05/16 15:53

参考:http://blog.sina.com.cn/s/blog_5da93c8f0102v042.html

1、java.lang.IllegalStateException: Fragment already added异常的处理。

当快速双击调用FragmentTransaction.add()方法添加fragmentA,而fragmentA不是每次单独生成的,就会引起这个异常。
DialogFragment.show()内部调用了FragmentTransaction.add()方法,所以调用DialogFragment.show()方法时候也可能会出现这个异常。

在add()方法时候,先判断fragmentA.isAdded(),如下调用可以避免该异常:

if(!fragmentA.isAdded()){    FragmentManager manager = ((FragmentActivity)context).getSupportFragmentManager();    FragmentTransaction ft = manager.beginTransaction();    ft.add(fragmentA, "fragment_name");    ft.commit();}

2、java.lang.IllegalStateException: Fragment MyFragment{410f6060} not attached to Activity

出现该异常,是因为Fragment的还没有Attach到Activity时,调用了如getResource()等,需要上下文Content的函数。
解决方法,就是等将调用的代码写在OnStart()中。另外一种解决方法主要是在调用:
getResources().getString(R.string.app_name); 之前增加一个判断isAdded(),
参考:
http://stackoverflow.com/questions/10919240/fragment-myfragment-not-attached-to-activity
http://stackoverflow.com/questions/6870325/android-compatibility-package-fragment-not-attached-to-activity

3、java.lang.IllegalStateException: Fragment already active

在 Fragment 没有被添加到 FragmentManager 之前,我们可以通过 Fragment.setArguments() 来设置参数,并在 Fragment 中,使用 getArguments() 来取得参数。在 Fragment 被添加到 FragmentManager 后,一旦被使用,我们再次调用 setArguments() 将会导致 java.lang.IllegalStateException: Fragment already active 异常。
解决方法:可以使用setter和getter方法进行数据的存储和获取。
参考:http://stackoverflow.com/questions/10364478/got-exception-fragment-already-active/15084683

4、java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

在使用Fragment保存参数的时候,可能是因为需要保存的参数比较大或者比较多,这种情况下页会引起异常。比如代码:
Bundle b = new Bundle();
b.putParcelable(“bitmap”, bitmap2);
imageRecognitionFragment.setArguments(b);
设置好参数,并且添加hide(),add(),方法之后,需要commit(),来实现两个Fragment跳转的时候,这种情形下参数需要进行系统保存,但是这个时候你已经实现了跳转,系统参数却没有保存。此时就会报
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
异常。
分析原因:你并不需要系统保存的参数,只要你自己设置的参数能够传递过去,在另外一个Fragment里能够顺利接受就行了,现在android里提供了另外一种形式的提交方式commitAllowingStateLoss(),从名字上就能看出,这种提交是允许状态值丢失的。到此问题得到完美解决,值的传递是你自己控制的。
这里也说一下另外一个问题,bitmap 也可以通过Bundle传递的,使用putParacelable就可以了。

5、长时间在后台Activity恢复时,Fragment报错

解决:Activity不保存Fragment状态,
Activity:

@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); if (outState != null) {     outState.remove(“android:support:fragments”);     } }

6、Fragment is already Added

commitAllowingStateLoss提交容许丢失状态
getSupportFragmentManager().executePendingTransactions();立即执行

7、多个Fragment切换,隐藏和显示,延迟加载

private void setFragment(int pos) { if (pos < 0 || pos >= fragments.size()) { pos = 0; } FragmentManager manager = getSupportFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); for (int i = 0; i < fragments.size(); i++) { Fragment fragment = fragments.get(i); if (fragment.isAdded()) {     if (pos == i) {         transaction.show(fragment);     } else {         transaction.hide(fragment);     } } else if (i == pos) {     transaction.add(R.id.fragment, fragment); } }    transaction.commitAllowingStateLoss();    manager.executePendingTransactions();}
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 感悟名人名言 描写人生感悟的句子 感悟作文600字 成长感悟作文 教师生活感悟 感悟学习生活 知足常乐感悟 医院工作感悟 人生感悟日记 爱情感悟经典名言 生命的感悟作文 对生命的感悟的句子 工作学习感悟 感悟人生读后感 安全教育感悟 丑小鸭的感悟 有关人生感悟的书 感悟生活短句 童年感悟100字 小学生生活感悟 时隔多年的感悟句子 关于分别的句子 银行工作成长感悟 读书笔记摘抄感悟 励志小故事及感悟 正能量故事及感悟 个人学习心得感悟600字 小文具店老板感悟 经典句子 人生感悟 穷爸爸富爸爸感悟 伤感语句 人生感悟 朝花夕拾阅读感悟 对企业文化的感悟 每天一个心灵感悟 保险公司培训感悟 营销小故事及感悟 经典语录人生感悟 人之初性本善感悟 小学数学培训感悟 对大学生活的感悟 同学聚会人生感悟