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()

参考博客:

https://www.cnblogs.com/liuling/p/2015-9-21-1.html

 https://blog.csdn.net/loveyh77/article/details/77042724

原文地址:https://www.cnblogs.com/fangg/p/9298328.html