Fragment叠影问题

作者: 冯奕欢 | 来源:发表于2016-06-30 16:41 被阅读160次

    我们用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的状态
      }
    

    相关文章

      网友评论

        本文标题:Fragment叠影问题

        本文链接:https://www.haomeiwen.com/subject/rdqfjttx.html