前几天用到了Fragment嵌套,各个界面切换都没问题,但长期后台放置被回收后再次启动Activity(onCreate再次被调用)后Fragment却没法切换了,怀疑是Fragment嵌套问题。打印log发现父Fragment中的FragmentManager中Fragment数量是原来的两倍,由于安卓内存管理机制,不好重现,只好拼命启动各种应用,狂占内存,重现bug,但依旧没找到问题所在,百度也没找到解决方案,论坛求助也没人鸟。。。。今天 突然想到横竖屏切换(onCreate被调用)可以很方便的重新之前的bug,打印一下getSupportFragmentManager().getFragments()发现里面保存的正是上次的Fragment!!!!!!问题终于解决了
下面是关键代码,NextFragment1中建议采用类似于MainActivity的懒加载方式
List<Fragment> list = getSupportFragmentManager().getFragments();
if (list != null) {
System.out.println("fs " + list.size() + " "
+ Arrays.toString(list.toArray()));
// try {//当第一次创建时,若只创建了部分Fragment则可能会越界
// fs[0] = list.get(0);
// fs[1] = list.get(1);
// fs[2] = list.get(2);
// fs[3] = list.get(3);
// fs[4] = list.get(4);
//
// } catch (Exception e) {
// // TODO: handle exception
// }
/**
* 这步很关键!!!!
* 1.list获取到的元素数可能大于fs数组长度
*
* 2.若第一次启动时,不是按照从左到右顺序先让各Fragment显示一遍的话,缓存顺序会错乱,导致下次启动时,各界面显示Fragment错乱问题
*/
for (int i = 0; i < fs.length&&i<list.size(); i++) {
Fragment fragment=list.get(i);
if (fragment!=null) {
String tag=fragment.getTag();
fs[Integer.parseInt(tag)]=fragment;//保证该Fragment对应正确的数组下标,可以在添加到FragmentMeanger中时顺便指定各Fragment的tag
}
}
} else {
fragment1=new Fragment1();
fs[0] =fragment1;
fs[1] = fragment2;
fs[2] = fragment3;
fs[3] =fragment4;
fs[4] = fragment5;
getSupportFragmentManager().beginTransaction()
.add(R.id.container, fs[0],"0").show(fs[0]).commit();
}