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();
.....
}