对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();
}
分类:
android提高篇
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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进行比较)的区别