android开发使用fragment commit时的一些坑
2015-06-24 15:02
393 查看
今天在开发过程中,发现一个问题,花了将近两个小时才解决。现在我把问题描述一下。我有一个两个界面(Activity),在第一个activity中使用了几个tag页的样式,每个tag页对应一个fragment,我写了一个函数setChartSelector,专门用来进行切换tab页的,当点击某一个地方时,进入横屏的界面。横屏界面也有几个tag页,和第一个activity的tab是一样的。我们的需求是,在横屏界面选择某一个tab页以后,返回到竖屏界面也要显示对应。但奇怪的是,我从横屏返回,竖屏界面的setChartSelector也执行了,但是在fragment
commit提交的时候,出现异常了。异常信息为:Can not perform this action after onSaveInstanceState。不切换屏幕时,在竖屏都是没有问题的。请见下图:
![](http://img.blog.csdn.net/20150624151145448?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVuYW5fbGlqaWVf/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
这个界面是竖屏,有分时、日k、周k、月k、分钟,这些tab,其实就是两个fragment。通过show和hide进行控制的。我们来看看横屏界面。
![](http://img.blog.csdn.net/20150624151447515?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVuYW5fbGlqaWVf/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
这个是横屏,横竖屏的分时、日k等tab是对应。如果用户在这个界面选择日k以后,返回竖屏,就停留在日k上。我原来以为这简单,在横屏界面返回时通过android eventbus post一个消息给竖屏界面,在竖屏界面接收到消息以后,调用setChartSelector即可。按照我这种想法做了以后就出现在FragmentTransaction commit时报Can not perform this action after onSaveInstanceState的异常,我使用的三星note 3手机测试,这个异常信息我还是跟踪调用fragment获取的,真是一波三折。没想到这么简单的一个功能花了这么久的时间,于是我就去网上找资料。发现有一个哥们也出现过这种情况,解决这个问题很简单,将commit(),替换成commitAllowingStateLoss()即可。
问题总算是解决了,但是我并不知道原因。于是我在网上又找到一篇文章。地址:http://zhiweiofli.iteye.com/blog/1539467。也说到这个异常。看完之后,我总算搞清楚原因了。我们知道activity在容易被系统销毁或者说即将被销毁时,系统通过回调onSaveInstanceState方法通知我们,以便我们在这个方法内部做一些状态保持的工作。
然后,我就在竖屏界面重新了这个onSaveInstanceState方法,没想到跳转到横屏界面时,竖屏的这个方法确实会执行。既然调onSaveInstanceState方法了,说明系统可能要回收这个activity,然后你在返回时commit,那当然就是所提示的。。。 after onSaveInstanceState,也就是说,在 onSaveInstanceState之后不能处理一些事件了。
这可能是android的一个bug。今天特将这个问题记录下来。
commit提交的时候,出现异常了。异常信息为:Can not perform this action after onSaveInstanceState。不切换屏幕时,在竖屏都是没有问题的。请见下图:
这个界面是竖屏,有分时、日k、周k、月k、分钟,这些tab,其实就是两个fragment。通过show和hide进行控制的。我们来看看横屏界面。
这个是横屏,横竖屏的分时、日k等tab是对应。如果用户在这个界面选择日k以后,返回竖屏,就停留在日k上。我原来以为这简单,在横屏界面返回时通过android eventbus post一个消息给竖屏界面,在竖屏界面接收到消息以后,调用setChartSelector即可。按照我这种想法做了以后就出现在FragmentTransaction commit时报Can not perform this action after onSaveInstanceState的异常,我使用的三星note 3手机测试,这个异常信息我还是跟踪调用fragment获取的,真是一波三折。没想到这么简单的一个功能花了这么久的时间,于是我就去网上找资料。发现有一个哥们也出现过这种情况,解决这个问题很简单,将commit(),替换成commitAllowingStateLoss()即可。
问题总算是解决了,但是我并不知道原因。于是我在网上又找到一篇文章。地址:http://zhiweiofli.iteye.com/blog/1539467。也说到这个异常。看完之后,我总算搞清楚原因了。我们知道activity在容易被系统销毁或者说即将被销毁时,系统通过回调onSaveInstanceState方法通知我们,以便我们在这个方法内部做一些状态保持的工作。
然后,我就在竖屏界面重新了这个onSaveInstanceState方法,没想到跳转到横屏界面时,竖屏的这个方法确实会执行。既然调onSaveInstanceState方法了,说明系统可能要回收这个activity,然后你在返回时commit,那当然就是所提示的。。。 after onSaveInstanceState,也就是说,在 onSaveInstanceState之后不能处理一些事件了。
这可能是android的一个bug。今天特将这个问题记录下来。
相关文章推荐
- Android HAL实例解析
- Android29_Loader
- Android28_Bitmap二次采样
- Android27_OptionsMenu、ContextMenu及PopupWindow自定义菜单
- Android ButterKnife使用
- AndroidManifest.xml文件属性详解
- Android开发Git:代码冲突常见解决方法
- android 如何把activity变成dialog
- Android JNI javah 命令使用
- androidstudio项目目录结构(抽时间去了解??)
- android让界面不被弹出的键盘挤上去
- Sundy Android高级应用课程
- android隐藏以及显示软键盘以及不自动弹出键盘的方法
- Android捕获View焦点事件,LinearLayout结合HorizontalScrollView实现ViewPgaer和选项卡Tabs联动
- android获取SD卡状态
- android获取mac地址
- Android学习笔记04:Android 缓冲进度条或加载进度条
- android获得手机联系人信息代码
- Android 4.2中对WebView.addJavascriptInterface()的修改
- android如何对应用进行单元测试