Fragment叠影问题

我们用add和hide方式来控制Fragment的切换经常会遇到这个坑–叠影。
原因是在切换到其他app的时候,fragment所在activity已经被销毁。并且在onSaveInstanceState(Bundle outState)方法保存了相关的数据。

  @Override  
  public void onSaveInstanceState(Bundle outState) {      
  // TODO Autogenerated method stub            
      Log.v("LH", "onSaveInstanceState"+outState);      
      super.onSaveInstanceState(outState);  
  }

当我再次回到这个app的时候,通过onCreate中的参数savedInstanceState恢复了之前的fragment。此时的FragmentTransaction中的相当于又再次add了fragment进去的,之前保存的fragment也还在。hide()和show()方法对之前保存的fragment已经失效了。所以出现了重叠的现象。
解决方法如下,在进入onCreate函数时,先去判断savedInstanceState是否为null,如果不为null,则表示里面有保存这四个fragment。则不再重新去add这四个fragment,而是通过Tag从前保存的数据中直接去读取。相关代码如下:

  @Override  
  public void onCreate(Bundle savedInstanceState) {     
      fManager = getFragmentManager();      
      if (savedInstanceState != null) {         
          allFrg = (AllFragment) fManager.findFragmentByTag("allFrg");          
          oneFrg = (OneFragment) fManager.findFragmentByTag("oneFrg");          
          twoFrg = (TwoFragment) fManager.findFragmentByTag("twoFrg");                     
      }      
      super.onCreate(savedInstanceState);       
  }

如果上面的方法不能解决问题,尝试一下这个的方法,跳过保存Fragment的状态,代码如下:

  public void onSaveInstanceState(Bundle outState) {      
      // TODO Autogenerated method stub           
      //Log.v("LH", "onSaveInstanceState"+outState);      
      //super.onSaveInstanceState(outState);   //将这一行注释掉,阻止activity保存fragment的状态
  }
    原文作者:冯奕欢
    原文地址: https://www.jianshu.com/p/7129ee949bda
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞