在项目中切换Fragment,一直都是用replace()方法来替换Fragment。但是这样做有一个问题,每次切换的时候Fragment都会重新实列化,重新加载一次数据,这样做会非常消耗性能用用户的流量。

官方文档解释说:replace()这个方法只是在上一个Fragment不再需要时采用的简便方法。

正确的切换方式是add(),切换时hide(),add()另一个Fragment;再次切换时,只需hide()当前,show()另一个。
这样就能做到多个Fragment切换不重新实例化:

切换方法:

/*** fragment 切换* * @param from* @param to*/public void switchContent(Fragment from, Fragment to, int position) {if (mContent != to) {mContent = to;FragmentTransaction transaction = fm.beginTransaction();if (!to.isAdded()) { // 先判断是否被add过transaction.hide(from).add(R.id.content_frame, to, tags[position]).commit(); // 隐藏当前的fragment,add下一个到Activity中} else {transaction.hide(from).show(to).commit(); // 隐藏当前的fragment,显示下一个
            }}}

这样做好后看似没问题。但是比较低端的手机内存不足的时候会造成fragment重叠的情况。

实是由Activity被回收后重启所导致的Fragment重复创建和重叠的问题。

在Activity onCreate()中添加Fragment的时候一定不要忘了检查一下savedInstanceState

多个Fragment重叠则可以这样处理:通过FragmentManager找到所有的UI Fragment,按需要show()某一个Fragment,hide()其他即可!

为了能准确找出所需的Fragment,所以在add()或者replace() Fragment的时候记得要带上tag参数,因为一个ViewGroup 容器可以依附add()多个Fragment,它们的id自然是相同的。

/*** 状态检测 用于内存不足的时候保证fragment不会重叠* * @param savedInstanceState*/private void stateCheck(Bundle savedInstanceState) {if (savedInstanceState == null) {fm = getFragmentManager();FragmentTransaction fts = fm.beginTransaction();AnimationFragment af = new AnimationFragment();mContent = af;fts.add(R.id.content_frame, af);fts.commit();} else {AnimationFragment af = (AnimationFragment) getFragmentManager().findFragmentByTag(tags[0]);PlainFragment pf = (PlainFragment) getFragmentManager().findFragmentByTag(tags[1]);RecordFragment rf = (RecordFragment) getFragmentManager().findFragmentByTag(tags[2]);InformationFragment inf = (InformationFragment) getFragmentManager().findFragmentByTag(tags[3]);TestingFragment tf = (TestingFragment) getFragmentManager().findFragmentByTag(tags[4]);getFragmentManager().beginTransaction().show(af).hide(pf).hide(rf).hide(inf).hide(tf).commit();}}

转载于:https://www.cnblogs.com/zhujiabin/p/5453605.html

android FRAMENT的切换(解决REPLACE的低效)相关推荐

  1. android fragment实例化,Android使得Fragment 切换时不重新实例化

    以前实现Fragment的切换都是用replace方法实现 public void startFragmentAdd(Fragment fragment) { FragmentManager frag ...

  2. Android切换泰语,Android应用内切换语言

    首先扯点别的:这是第一次在简书上写东西,我突然明白为啥这么多人在简书上写东西了,因为没有广告啊,哈哈. 最近接触到Android 应用内切换语言的问题,研究了两天,做个记录先.实现了中文,英文,泰语的 ...

  3. Android 听筒扬声器切换 并且监听音量变化

    记录一下. 在activity 监听按键: @Override public boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode = ...

  4. android 横竖屏幕切换,Android 横竖屏切换总结

    一.Android切换横竖屏 应用的横竖屏设置 应用的横竖屏设置主要是通过Activity的screenOrientation属性控制,属性值如下: 主要有以下两种方式设置screenOrientat ...

  5. Android Studio 4.22 解决com.android.tools.idea.run.ApkProvisionException

    Android Studio 4.22 解决 Unable to determine application id: com.android.tools.idea.run.ApkProvisionEx ...

  6. android 横竖切换快捷键,Android横竖屏切换总结

    Android横竖屏要解决的问题应该就两个: 一.布局问题 二.重新载入问题 1.布局问题:如果不想让软件在横竖屏之间切换,最简单的办法就是在项目的AndroidManifest.xml中找到你所指定 ...

  7. Android横竖屏切换

    尊重原创,本文转载自 http://www.cnblogs.com/franksunny/p/3714442.html Android横竖屏切换小结 (老样子,图片啥的详细文档,可以下载后观看 htt ...

  8. android横竖屏切换总结

    Android横竖屏切换总结 (老样子,图片啥的详细文档,可以下载后观看 http://files.cnblogs.com/franksunny/635350788930000000.pdf) And ...

  9. Android—横竖屏切换小结

    Android横竖屏切换小结 (老样子,图片啥的详细文档,可以下载后观看 http://files.cnblogs.com/franksunny/635350788930000000.pdf) And ...

  10. Android 访问相册切换背景

    前言 Gilde框架用起来爽的不行,啊,pong友们可以百度了解.XIO习一下 初识图片加载框架--Glide的简单用法 前端代码 1.activity_main.xml <LinearLayo ...

最新文章

  1. 『浅入浅出』MySQL 和 InnoDB
  2. Mysql常见的面试总结
  3. getElementById()方法取值
  4. [C++11]move资源的转移
  5. PMP读书笔记(第10章)
  6. Spring、Ibatis结合MySQL数据库的使用方法
  7. idea配置svn地址
  8. 【安卓】悬浮球源代码(长按判断、多次点击判断、自动贴边)
  9. java毕业设计软件源代码SSM酒店管理系统|旅店管理
  10. 物联网平台 yyds
  11. Spelling Error Correction with Soft-Masked BERT
  12. Xiaojie雷达之路---毫米波雷达基础知识---距离估计
  13. stc15系列c语言pwm编程,stc15f2k60s2单片机 pwm程序 可调占空比
  14. python制作三天打鱼两天晒网
  15. 计算机开机一直无法访问,关于电脑开机一直正在启动的详细处理方法
  16. 串口硬盘与并口硬盘详解:IDE SATA SCSI 接口详解
  17. 使用Typora工具绘制流程图
  18. 万能引用,引用折叠,右值变左值的情况
  19. 如何快速提升网站百度权重
  20. Python办公自动化实战 02 | 三十分钟手把手教学批处理命令快速上手提升办公效率

热门文章

  1. nyoj 买水果(组合数求法与分析)
  2. js sdk demo java_微信JS-SDK DEMO页面和示例代码
  3. 【IDEA】jsp页面中的代码一不小心变成黄色,代码被识别成sql脚本解决办法
  4. 【2019杭电多校第五场1006=HDU6629】string matching(求后缀字符串和本串的最长公共前缀长度之和--扩展kmp)
  5. 风控中英文术语手册(银行_消费金融信贷业务)
  6. 安装mysql输入_安装mysql
  7. 单板计算机图片大全,最强单板计算机UP Board之Windows10完全版、Ubuntu、Andriod系统体验 | 爱板网...
  8. mysql 备份任务_设置mysql 定时备份任务
  9. Deep Learning for Joint Channel Estimation and Feedback in Massive MIMO Systems
  10. java多线程(1)----多线程的概述