问题原因
造成fragment重影的原因是因为我们代码里用add fragment 然后调用hide和show来替换replace方式(因为这样做不用每次切换fragment都重新加载界面和数据)。但是正因为这样当我们activity异常关闭重启时你原先的所有fragment也都会跟着activity重新绘制出来,然而这个时候所有的hide和show失灵了,因为我们默认是没有找到系统帮我们恢复的fragment,而是自己又重新new了一个fragment出来,
解决思路
我的解决思路是采用保存Tag的方式,每添加一个fragment就为它设置一个独立的Tag,就跟ListView复用布局设置Tag是一样的道理,换位思考下就懂了,在Activity恢复时判断通过查找Tag的方式将上次的fragment移除,就可以完美解决重影的问题。
解决步骤
我们在Activity的onCreate中去判断 savedInstanceState 这个参数是否为 null,如果不为null说明Activity为死而复活状态(这时我们要移除前面已经存在的fragment),否则为正常状态,代码如下。
onCreate方法代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.initData(savedInstanceState);
mManager = getSupportFragmentManager();
//不为null,说明是死而复活,移除已经存在的fragment
if (savedInstanceState != null) {
mTransaction = mManager.beginTransaction();
mTransaction.remove(mManager.findFragmentByTag(Constant.SOURCE_HEADLINES_TAG));
mTransaction.remove(mManager.findFragmentByTag(Constant.BUILDING_ONLINE_TAG));
mTransaction.remove(mManager.findFragmentByTag(Constant.HOME_TAG));
mTransaction.remove(mManager.findFragmentByTag(Constant.SUN_OPEN_TAG));
mTransaction.remove(mManager.findFragmentByTag(Constant.WISDOM_CLOUD_TAG));
mTransaction.commitAllowingStateLoss();
}
initFragment();
//多余代码不再贴出
......
}
initFragment方法代码
private void initFragment(){
mTransaction = mManager.beginTransaction();
mTransaction.add(R.id.fl_fragment_group, mSourceHeadlines, Constant.SOURCE_HEADLINES_TAG);
mTransaction.add(R.id.fl_fragment_group, mBuildingOnline, Constant.BUILDING_ONLINE_TAG);
mTransaction.add(R.id.fl_fragment_group, mHome, Constant.HOME_TAG);
mTransaction.add(R.id.fl_fragment_group, mSunOpen, Constant.SUN_OPEN_TAG);
mTransaction.add(R.id.fl_fragment_group, mWisdomCloud, Constant.WISDOM_CLOUD_TAG);
/**
* 修复Fragment.setNextAnim出现空指针的问题,原因就是没有将Fragment添加到回退栈中,加上下面一行代码即可
*/
mTransaction.addToBackStack(null);
mTransaction.hide(mSourceHeadlines);
mTransaction.hide(mBuildingOnline);
mTransaction.hide(mSunOpen);
mTransaction.hide(mWisdomCloud);
mTransaction.show(mHome);
mTransaction.commitAllowingStateLoss();
}
参考: https://blog.csdn.net/leisurelife1990/article/details/51258749