Android开发:V4包fragment, getActivity()报空以及页面产生混乱的解决方案

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jiaoyaning1210/article/details/51159728

问题描述

Android开发中,如果我们用到V4包里面的Fragment,在App被切换到后台的时候,由于系统内存不足、或者切换横竖屏、又或者 App长时间在后台运行,Activity可能被回收,这种情况下fragment中的getActivity()会出现空指针异常。
如果没有用到getActivity(),也可能会出现页面混乱的情况。


问题原因

在App在后台被回收的时候,Fragment的状态被保存,而且并未随着父Activity的回收而被回收。
这种情况下,当我们再次打开后台的App后,首先加载的是未被回收的Fragment。
但此时,父Activity已经被内存回收,系统会重启该Activity,Fragment会再次被加载,这时就产生了第二种情况:页面混乱
如果Fragment中调用了getActivity()方法,由于父Activity重启还未完成,所以getActivity()方法会报空,这也就是第一种情况:getActivity()报空


解决方案

重点来了,如果了解了该问题产生的原因,解决方案就变得很简单。

第一种方法:不保存Ftagment的状态

在父Activity中,重写onSaveInstanceState()方法,将super.onSaveInstanceState(outState);注释掉,让其不再保存Fragment的状态,达到其随着MainActivity一起被回收的效果!

第二种方法:在恢复Fragment之前把保存Bundle里面的数据给清除

在是onCreate方法中加加上如下代码,其中arg0 就是的Bundle savedInstanceState这个参数

if(arg0 != null)
        {
            String FRAGMENTS_TAG = "android:support:fragments";
            // remove掉保存的Fragment
            arg0.remove(FRAGMENTS_TAG);
        }

感谢:
http://blog.sina.com.cn/s/blog_5da93c8f0102wc4f.html
http://blog.csdn.net/wantnowhy/article/details/24405845/

猜你喜欢

转载自blog.csdn.net/jiaoyaning1210/article/details/51159728