您的位置:首页 > 移动开发 > Android开发

Android Fragment数据保存问题

2015-07-30 23:24 281 查看
Fragment这个东西在3.0出来以后,一直在不断的进步,谷歌方面也在鼓励开发者多使用fragment,我最近看到一篇关于最佳实践文章(说起来,在stackOverFlow上看到说,the best practice is using your brain,大概就是这个意思),也说最好是用fragment呈现数据,activity用来管理fragment。相信大家在使用fragment的时候,比较头痛的一点就是fragment的数据保存和回复问题,我最近呢也稍微写了写,决定作个记录,一方面是加深记忆,另外如果能为大家解决问题那就最好了。

这篇文章最主要讲两个方面,一是关于切换屏幕方向的,二是关于两个fragment之间切换的。

首先是关于切换屏幕方向,大家都知道切换屏幕方向以后,activity会重新走一遍生命周期的函数,这应该是谷歌方面为了让切换方向以后activity有机会换一个layout,既然是这样,那fragment也就跟着activity重新走了一边生命周期,有些数据也就不会保持了,注意这里是有一些,像editText这样的,数据依旧会保持,但是textView这样的就不会了,想要保持数据也很简单,重写fragment里的onSaveInstanceState这个函数就可以了,这个函数的作用和activity的onSaveInstanceState一样,在切换屏幕方向,按下Home键等等时候都会调用,直接利用里面的Bundle参数保存数据,然后在onCreate,onCreateView这些函数里恢复就可以了。第二种方法是在manifest里对当前activity设置configChanges,我看网上很多文章,都说是设置"orientation|keyboardHidden",这个在4.0以后的系统中是没用的,4.0以后要设置成"orientation|screenSize",注意了!这样一来,屏幕切换的时候,activity就不会重新走一遍生命周期函数了,而是调用onConfigurationChanged这个函数,想要做什么在这里面写就可以了。当然了,还有一种方法,那就是强制activity不能切换屏幕方向。

第二个问题是关于两个fragment之间切换的,fragment的切换是通过fragmentTrasaction来管理的,具体(或者说简单?)来说,一种是用replace来替换,还有一种是通过hide和show来替换。一开始我觉得也就是重写onSaveInstanceState这个函数就可以了,但是后来发现用了replace之后,根本不会调用这个函数。。真坑。所以就想着用hide和show来做替换,这样数据就能保持了,但是又会有一个问题,如果你把你的APP置于后台很久,你重新切回去会发现fragment会出现重叠的现象,这是因为当你的APP置于后台很久之后,系统会回收,你切回去,activity又会重新走一边生命周期,在onCreate的时候重新创建一个fragment,而之前那个fragment也会被带到前台,所以就出现了重叠。至于之前那个fragment为什么会带到前台,这我不是很确定,看过两篇文章,说是当activity被回收之后,frgament等数据被保存到了savedInstanceState这个Bundle中,当切回去以后,activity会通过反射调用保存的fragment的无参构造函数来重新初始化。解决这个问题的方法就是判断一下savedInstanceState这个参数是否为null,如果是null,就创建一个fragment,如果不是null,就通过fragmentTrasaction的findFragmentByTag来寻找到之前的那个fragment,当然能找到的前提就是在add的时候加tag,mTransaction.add(R.id.container,mFragment,"fragment1");
类似这样。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: