Fragment各种问题

来源:互联网 发布:关于中医的软件 编辑:程序博客网 时间:2024/05/17 23:48

1.Fragment不重复加载问题

       开始使用replace方法来添加,后面发现replace相当于先remove然后在add,是为了方便加载新fragment时抛弃前一个fragment的简单方法。后面就改用add、hide和show来解决,然后在onHiddenChanged(boolean hidden)中知道fragment切换后是显示还是隐藏。

     

2.内存回收后在进入不显示问题

   Fragment由FragmentManager来管理,而不由FragmentActivity来管理。所以FragmentActivity被回收(比如长时间不使用被回收或者使用清理内存的软件等)时,fragment不一定被销毁,它在FragmentManager中还是存在引用的。FragmentActivity被销毁时会调用onSaveInstanceState方法,如果重写此方法,注释掉super.onSaveInstanceState(outState),那么fragment也将会被回收,但注释掉此方法可能会引起其他保存状态的相关问题。

   当FragmentActivity被回收后,我们又点击进入时,我们一般的处理情况就是重新生成fragment,这就造成问题了。之前FragmentManager中的fragment引用没有被销毁,这时又重新创建一个然后添加,造成不显示或者显示空白等多种坑爹的情况。解决的办法就是在onCreate(Bundle arg0)是判断Bundle 是否为空,不为空的情况就是FragmentActivity被回收又重新进入的情况。然后在不为空个情况下在FragmentManager中重新找到或者销毁所有的fragment引用。

   我用的是重新找到frament,在add时调用FragmentTransaction.add(R.id.content,fragment,"当前fragment的tag"),在onCreate(Bundle arg0)方法中:

   // activity被销毁,重新找到fragment
  if (arg0 != null) {
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

     Fragment fragment1 = getSupportFragmentManager().findFragmentByTag("要查找的fragment的tag1");

     ......

     // 找到后先隐藏

     if(fragment1 != null){

        ft.hide(fragment);

     }

     .....

     ft.commitAllowingStateLoss();

     .....

  }

0 0
原创粉丝点击