Fragment
Fragment、FragmentActivity和Activity的区别:
fragment是Android4.0以上才有的,为了适应Android碎片化采用的技术(解决平板上的显示效果)
1、fragmentactivity继承自activity,用来解决android4.0 之前没有fragment的api,所以在使用的时候需要导入support包,同时继承fragmentActivity,这样在activity中就能嵌入fragment来实现你想要的布局效果。
2、当然4.0之后你就可以直接继承自Activity,并且在其中嵌入使用fragment了。
3、获得Manager的方式也不同
4.0以下:getSupportFragmentManager()
4.0以上:getFragmentManager()
常见问题
APP待机一会后,切换Fragment,程序奔溃闪退。
可能原因
空指针异常。在fragment中使用getActivity()或者getContext()为可空。
Activity切换到后台之后,由于内存不够,此Activity被系统回收了,一段时间之后回到该应用程序,Activity被重新实例化了。而Activity被系统销毁时,附属在该Activity的Fragment并没有被销毁,在Activity的onSaveInstanceState里面将Fragment状态保存起来了,所以Activity重新创建了,但是Fragment还是之前的。而此时fragment附属的activity已经被回收了。因此再次调用getActivity()会返回为空。
系统内存不足、或者切换横竖屏、或者app长时间在后台运行,Activity都可能会被系统回收,然后Fragment并不会随着Activity的回收而被回收,从而导致,Fragment丢失对应的Activity。
我们看看FragmentActivity源码中的onSaveInstanceState方法:
protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Parcelable p = mFragments.saveAllState(); if (p != null) { outState.putParcelable("android:support:fragments", p); } }
由上面源码可以看出,FragmentActivity确实在onSaveInstanceState方法里面将Fragment的状态保存了。
解决方案一
解决方法其实很简单,我们只要让FragmentActivity被系统回收的时候,不保存Fragment的状态即可,即在FragmentActivity中重写onSaveInstanceState方法,并且注释掉super.onSaveInstanceState(outState)就行了。
@Override protected void onSaveInstanceState(Bundle outState) { // super.onSaveInstanceState(outState); }
解决方案二
context使用之前判空
当出现这个问题时,只要在Fragment 中声明一个上下文类型的成员变量,并在onAttach()方法中将getActivity()的值赋给变量,在Fragment中使用到getActivity()时,都是用context即可。也就是说在将Fragment挂载到Activity时,就获得到了这个activity,并将这个activity保存起来了,这样就可以直接使用而不需要每次使用时都调用一遍getActivity()了。
解决方案三
在add(fragment) 的时候进行判断 是否已经添加该fragment
方法是isAdded()
参考博客: