关于横竖屏切换后Fragment发生重叠问题的解决

在一个小项目中用到了ViewPager,所以在网上学习相关文章。

看到了VeiwPager结合Fragment的使用,所以重新学习了Fragment的相关知识。


在读了郭大神的博客之后顺手也做了一次,发现了一个小问题。

在这里作为学习总结记录,如有错误请指出,感谢。


原文:http://blog.csdn.net/guolin_blog/article/details/13171191


原文是通过在最开始将所有已添加(add)的fragment 用hide()函数隐藏起来。再把选中的fragment 展示(show())出来。

达到了点击tab切换fragment的效果。

关于横竖屏切换后Fragment发生重叠问题的解决_第1张图片



按照原文照做了一遍,得到了同样的效果,但是在旋转屏幕时,发生了fragment的重叠



关于横竖屏切换后Fragment发生重叠问题的解决_第2张图片



于是去查看了在横竖屏切换时fragment的生命周期


发现在切换后fragment会被重建。


参考:http://blog.csdn.net/u010216716/article/details/50697408


解决方法1:


在原文的评论中发现了解决方法是:

在Manifest里的标签里增加
android:configChanges="orientation|keyboardHidden

加上之后重新运行程序依旧会产生重叠效果。

又去查了android:confiChanges,得到:


对android:configChanges属性,一般认为有以下几点:

1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法


但是大家需注意的是,在4.0以后的版本需要加上ScreenSize


加上了ScreenSize之后重试,发现切换屏幕不再产生重叠。


参考:http://blog.csdn.net/dengweijunkedafu/article/details/38925501







解决方法2:


在原文评论下又找到了新的解决方法:


所以又去搜了findFragmentByTag()和横竖屏切换相关的文章


得知,在横竖屏切换后由于fragment都为null,所以拿不到fragment,hide()函数失效,所以发生了重叠。


修改步骤:

在add()里加上第三个参数 tag

transaction.add(R.id.content, messageFragment,"message");

在hideFragments()函数里用findFragmentByTag()获取fragment。

messageFragment = (MessageFragment) fragmentManager.findFragmentByTag("message");

再进行fragment是否为空时就可以正确判断。



总结:


横竖屏切换后重叠的原因是:切换后Activity会重新调用各个生命周期,变成全新的对象, 所有Fragment中的成员变量也会丢失,但所有的Fragment状态数据会被保留并还原,这个时候所有的视图都会重新创建。

方法1是使横竖屏切换时不会销毁Activity(fragment)
方法2 是找回被还原的fragment



参考:http://www.cnblogs.com/wjhblogs/p/4688921.html



















你可能感兴趣的:(安卓学习)