fragment的切换(解决REPLACE的低效)
在项目中切换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();
}
}

fragment的切换(解决REPLACE的低效)的更多相关文章
- Android fragment的切换(解决REPLACE的低效)
在项目中切换Fragment,一直都是用replace()方法来替换Fragment.但是这样做有一个问题,每次切换的时候Fragment都会重新实列化,重新加载一次数据,这样做会非常消耗性能用用户的 ...
- ANDROID FRAMENT的切换(解决REPLACE的低效)
http://www.cnblogs.com/android-joker/p/4414891.html 在项目中切换Fragment,一直都是用replace()方法来替换Fragment.但是这样做 ...
- ViewPager之Fragment页面切换
一.概述 ViewPager是android-support-v4中提供的类,它是一个容器类,常用于页面之间的切换. 继上篇文章<ViewPager之引导页>之后,本文主要介绍ViewPa ...
- 仿知乎程序 fragment的切换以及toolbar在不同页面下显示的menu不同
我们在看知乎的时候,你会发现,首页,发现,关注,收藏,草稿这五项,你在点击之后进入到相应页面之后,侧滑菜单还在,你左侧滑一下,这个侧滑菜单还在,而提问,左滑屏幕,这个页面就没有,有点像返 ...
- Fragment保持状态切换,fragment状态切换
在使用Activity管理多个Fragment时,每次切换Fragment使用的是replace,结果导致出现xxx is not currently in the FragmentManager异常 ...
- Fragment与Fragment相互切换之间的生命周期方法
Fragment 1 切换到 Fragment 2时生命周期变化 1.通过 add hide show 方式来切换 Fragment Fragment1 的生命周期变化为:onCreate().onC ...
- AndroidStudio制作底部导航栏以及用Fragment实现切换功能
前言 大家好,给大家带来AndroidStudio制作底部导航栏以及用Fragment实现切换功能的概述,希望你们喜欢 学习目标 AndroidStudio制作底部导航栏以及用Fragment实现切换 ...
- Fragment保持状态切换
在使用Activity管理多个Fragment时,每次切换Fragment使用的是replace,结果导致出现xxx is not currently in the FragmentManager异常 ...
- 怎么通过activity里面的一个按钮跳转到另一个fragment(android FragmentTransaction.replace的用法介绍)
即:android FragmentTransaction.replace的用法介绍 Fragment的生命周期和它的宿主Activity密切相关,几乎和宿主Activity的生命周期一致,他们之间最 ...
随机推荐
- Atitit jOrgChart的使用 组织架构图css html
Atitit jOrgChart的使用 组织架构图css html 1. 项目要做组织架构图,要把它做成自上而下的树形结构,于是决定1 2. Html导入 以来的css js1 2.1. 数据来源 ...
- MyEclipse 2015 CI 14发布(附下载)
支持Web和Node.jsd的JavaScript Debugger调试器,新版本功能更加强大,在MyEclipse调试web应用程序变得更方便.调试器支持断点.变量和表达式. 类的动态预加载用Hot ...
- Merry Christmas & Happy New Year!!
圣诞快乐,新年快乐!
- yii cookie ,session 操作
一,在Yii中使用session 1,CHttpSession 与原生态php5的session使用差别是,php5使用session_start();$_session['key'] = $valu ...
- 【代码笔记】iOS-看图听声音
一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> #import <AVFoundation/AVFo ...
- IOS开发之待探究随录
设置导航条的问题
- MPlayerX——MAC OS 最好用的播放器
MPlayerX真是一个不错的软件,它真的可以称得上在MAC OS里最好用的播放器,它功能强大,可以播放你所知道的任何格式的视频和音频文件.他的选项非常丰富,可以自定义设置的东西很多,但又不失简洁的风 ...
- (转) 一步一步学习ASP.NET 5 (三)- 认识新的Web结构
转发:微软MVP 卢建晖 的文章,希望对大家有帮助.原文:http://blog.csdn.net/kinfey/article/details/44421979 编者语 : 今天微软的两大盛事,早上 ...
- 对js中Function的浅见
它到底是什么 String Array 都是系统内置对象(已经定义好,可以直接使用)当然,这货也是一样,我们之前定义的函数,其实就是一个这货的实例. 在JS中,所有的对象都是由函数实现的,函数的数据类 ...
- 【译】Java中的可变参数
译文链接 http://www.programcreek.com/2014/01/java-varargs-examples/ 什么是Java可变参数 可变参数是Java 1.5引入的一个特性,它允许 ...