对Fragment切换的优化

在项目中需要进行Fragment的切换,一直都是用replace()方法来替换Fragment:然后总感觉切换的时候有些卡顿,原来的代码

/**
	 * 切换页面,这里采用回调
	 * 
	 * @param f
	 */
	public void switchFragment(Fragment f) {
		if (f == null)
			return;
		FragmentTransaction transaction = getSupportFragmentManager()
				.beginTransaction();
		transaction.replace(R.id.fl_main, f);
		// transaction.addToBackStack(descString);
		transaction.commit();

		// 让menu回去
		menu.toggle();

	}

但是,这样会有一个问题:

每次切换的时候,Fragment都会重新实例化,重新加载一边数据,这样非常消耗性能和用户的数据流量。

就想,如何让多个Fragment彼此切换时不重新实例化?

翻看了Android官方Doc,和一些组件的源代码,发现,replace()这个方法只是在上一个Fragment不再需要时采用的简便方法。

正确的切换方式是add(),切换时hide(),add()另一个Fragment;再次切换时,只需hide()当前,show()另一个。

这样就能做到多个Fragment切换不重新实例化

/**
	 * 切换页面的重载,优化了fragment的切换
	 * 
	 * @param f
	 * @param descString
	 */
	public void switchFragment(Fragment from, Fragment to) {
		if (from == null || to == null)
			return;
		FragmentTransaction transaction = getSupportFragmentManager()
				.beginTransaction().setCustomAnimations(R.anim.tran_pre_in,
						R.anim.tran_pre_out);
		if (!to.isAdded()) {
				// 隐藏当前的fragment,add下一个到Activity中
				transaction.hide(from).add(R.id.fl_main, to).commit();
			} else {
				// 隐藏当前的fragment,显示下一个
				transaction.hide(from).show(to).commit();
			}
		// 让menu回去
		menu.toggle();
	}
posted @   brave-sailor  阅读(426)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
历史上的今天:
2014-11-03 Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)
2014-11-03 Android 开源框架Universal-Image-Loader完全解析(三)---源代码解读
2014-11-03 Android 开源框架Universal-Image-Loader完全解析(二)--- 图片缓存策略详解
2014-11-03 Android 开源框架Universal-Image-Loader完全解析(一)--- 基本介绍及使用
2014-11-03 Android ListView 滚动的N种方法
2014-11-03 Java和C#中String直接赋值与使用new创建(==与equals进行比较)的区别
点击右上角即可分享
微信分享提示