码迷,mamicode.com
首页 > 其他好文 > 详细

FragmentActivity 长期后台被放置问题

时间:2015-05-04 18:03:59      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:安卓   fragment   缓存   

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

FragmentActivity 长期后台被放置问题

标签:安卓   fragment   缓存   

原文地址:http://blog.csdn.net/qingchunweiliang/article/details/45482639

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!