HTTPS://WWW.CNBLOGS.COM/ANDROID-JOKER/P/4414891.HTML https://www.cnblogs.com/android-joker/p/4414891
来源:互联网 发布:邪恶力量第十二季 知乎 编辑:程序博客网 时间:2024/04/28 09:27
HTTPS://WWW.CNBLOGS.COM/ANDROID-JOKER/P/4414891.HTML
https://www.cnblogs.com/android-joker/p/4414891.html
https://www.cnblogs.com/android-joker/p/4414891.html
ANDROID FRAMENT的切换(解决REPLACE的低效)
Posted on 2015-04-10 15:58 阿祥当码农 阅读(26150) 评论(2) 编辑 收藏在项目中切换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(); } }
阅读全文
0 0
- HTTPS://WWW.CNBLOGS.COM/ANDROID-JOKER/P/4414891.HTML https://www.cnblogs.com/android-joker/p/4414891
- https://www.cnblogs.com/sea-star/p/rtcp.html
- https://www.cnblogs.com/by-dream/p/5611555.html
- https://www.cnblogs.com/Y1Focus/p/6707121.html
- 转载logback简要用法 原文地址https://www.cnblogs.com/warking/p/5710303.html
- ServletConfig获取配置信息、ServletContext的应用https://www.cnblogs.com/smyhvae/p/4140877.html
- MySQL中interactive_timeout和wait_timeout的区别(https://www.cnblogs.com/ivictor/p/5979731.html)
- JSON技术的调研报告(https://www.cnblogs.com/kunpengit/p/4001680.html)
- redis学习命令大全(转载https://www.cnblogs.com/woshimrf/p/5198361.html)
- https://www.cnblogs.com/wt645631686/p/6867651.html?utm_source=itdadao&utm_medium=referral
- https://www.cnblogs.com/sylz/p/6858544.html?utm_source=itdadao&utm_medium=referral
- python随机数用法 转载自https://www.cnblogs.com/skyEva/p/6097157.html
- IntelliJ IDEA2017 修改缓存文件的路径(转载:https://www.cnblogs.com/acm-bingzi/p/ideaCachePath.html)
- [微信开发] 微信网页授权Java实现(https://www.cnblogs.com/lovebread/p/5513241.html)
- Android网络开启、关闭整理http://www.cnblogs.com/huazaizai/p/3398675.html
- Android MTP 转载http://www.cnblogs.com/skywang12345/p/3474206.html
- Android Studio导入Fresco--转载自http://www.cnblogs.com/stay/p/4398432.html
- Android: 详解触摸事件如何传递 - 玲音 原文 http://www.cnblogs.com/superlcr/p/3946034.html
- 获取文件的MD5
- Java 注解
- [学习笔记][Java编程思想]第11章:持有对象
- Hbase 上传CSV文件
- ES6~解构赋值
- HTTPS://WWW.CNBLOGS.COM/ANDROID-JOKER/P/4414891.HTML https://www.cnblogs.com/android-joker/p/4414891
- 用ipython 写spark
- Go Effective
- gunicorn + Flask架构中使用多进程全局锁
- Android 64位变32位
- submint()和onsubmit() 的区别
- HDU
- ORACLE SQL TUNING ADVISOR 使用方法
- 如何查找论文资料