前几天用到了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(); }
工程源码 http://pan.baidu.com/s/1qWp3MUw
原文地址:http://blog.csdn.net/qingchunweiliang/article/details/45482639