zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    POJ 1426 Find The Multiple(数论——中国同余定理)
    POJ 2253 Frogger(Dijkstra变形——最短路径最大权值)
    POJ 3790 最短路径问题(Dijkstra变形——最短路径双重最小权值)
    POJ 3278 Catch That Cow(模板——BFS)
    HDU 1071 The area
    HDU 1213 How Many Tables(模板——并查集)
    POJ 1611 The Suspects
    light oj 1214 Large Division
    POJ 1258 Agri-Net(Prim算法求解MST)
    POJ 2387 Til the Cows Come Home(模板——Dijkstra算法)
  • 原文地址:https://www.cnblogs.com/fangg/p/9298328.html
Copyright © 2011-2022 走看看