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