FragmentActivity 长期后台被放置问题

前几天用到了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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值