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

  • 相关阅读:
    spring声明式事务
    spring的传播行为和隔离级别
    索引(index)
    存储过程(转)
    Java中ArrayList相关的5道面试题
    记CVTE2014年春季招聘实习生求职历程
    Java中String,StringBuffer,StringBuilder的区别及其使用
    Linux下C程序的编译,运行,及调试
    skynet源码分析之skynet_server
    skynet源码分析之skynet_module
  • 原文地址:https://www.cnblogs.com/fangg/p/9298328.html
Copyright © 2011-2022 走看看