首先,在http://blog.youkuaiyun.com/shimiso/article/details/44677007 这个大神的讲解已经很详细了,让人受益良多!
那么在我实际的开发中:也出现这个重叠现象,用两种方法可以解决:
(1)在activity有可能被销毁时,tabFragment被制空,它并不是不存在了,只是引用不存在了,我们可以在onSaveInstanceState(Bundle outState)中保存fragment,然后在onCreat(Bundle saveInstanceState)中如果saveInstanceState 不等于空,找回之前的fragment。
具体代码: protected void onSaveInstanceState(Bundle outState){
outState.putInt("fragment_index",current_index); // 其中 current_index 是当前的fragment的current_item;
fragmentManager.putFragment(outState,"oneFragment",onFragment); // 中间的值相当于一个key 对应的value是第三个值
fragmetnManager.putFragment(outState,"twoFragment",twoFragment);
fragmentManager.putFragment(outState,"threeFragment",threeFragment);
}
然后在onCreate(Bundle saveInstanceState)中
protected void onCreate(Bundle saveInstanceState){
if(saveInstatnceState != null){
current_index = saveInstanceState.getInt("fragment_index",0);
oneFragment = (OneFragment)fragmentManager.getFragment(saveInstanceState,"oneFragment"); // 第二个参数就是上面中的key,对应起来
...
}
}
(2)第二种方法:不用在OnSaveInstatnceState(Bundle onutState)中使用manager.putFragment(...); 我们在调用fragment的add时 ,加上tag,让后再protected void onCreate(Bundle saveInstanceState){} 中使用 fragmentManager.findFragmentByTag(String Tag) 找到之前的fragment。
代码:
private void setTabSelection(int index) { FragmentTransaction transaction = manager.beginTransaction(); hideFragment(transaction); switch (index){ case MAIN_ZHUYE: if(oneFragment == null){ oneFragment = new OneFragment(); transaction.add(R.id.fl_content,oneFragment,"oneFragment"); // 第三个参数是tag }else { transaction.show(oneFragment); } break; case MAIN_SHEQU: if(twoFragment == null){ twoFragment = new TwoFragment(); transaction.add(R.id.fl_content,twoFragment,"twoFragment"); }else { transaction.show(twoFragment); } break; case MAIN_XIAOXI: if(threeFragment == null){ threeFragment = new ThreeFragment(); transaction.add(R.id.fl_content,threeFragment,"threeFragment"); }else { transaction.show(threeFragment); } break; } transaction.commit(); }
然后在:
protected void onCreate(Bundle saveInstanceState){
if(saveInstatnceState != null){
current_index = saveInstanceState.getInt("fragment_index",0);
oneFragment = fragment.findFragmentByTag("oneFragment"); // tag
...
}
}
ps: 在用第一中方法的时候,还是有点问题,建议使用第二种方法!