android开发使用fragment commit时的一些坑

来源:互联网 发布:免费ppt模板 知乎 编辑:程序博客网 时间:2024/06/14 02:41

今天在开发过程中,发现一个问题,花了将近两个小时才解决。现在我把问题描述一下。我有一个两个界面(Activity),在第一个activity中使用了几个tag页的样式,每个tag页对应一个fragment,我写了一个函数setChartSelector,专门用来进行切换tab页的,当点击某一个地方时,进入横屏的界面。横屏界面也有几个tag页,和第一个activity的tab是一样的。我们的需求是,在横屏界面选择某一个tab页以后,返回到竖屏界面也要显示对应。但奇怪的是,我从横屏返回,竖屏界面的setChartSelector也执行了,但是在fragment 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。今天特将这个问题记录下来。








0 1