对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();
	}
时间: 2024-10-10 10:21:18

对Fragment切换的优化的相关文章

【Fragment精深系列7】Fragment切换优化

一.Fragment+RadioGroup ??在项目中需要进行Fragment的切换,一直都是用replace()方法来替换Fragment:然后总感觉切换的时候有些卡顿. 1.以前的代码: radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup radioGroup, int checkI

解决 viewpager fragment 切换 Fragment被销毁的问题

当我们用FragmentViewPagerAdapter和ViewPager来完成滑动切换选项卡时,效果非常不错,但是后来遇到一个问题,FragmentA切换到FragmentB,再滑到FragmentC时,FragmentA的状态数据已经不予保存了,再次滑动到FragmentB时,FragmentA的oncreateView方法会重新调用,如果有网络请求,将会是非常蛋疼,在网上找了半天,最后看到viewpager中有个这样的方法setOffscreenPageLimit,设置为2,然后再一试,

Fragment切换动画

题外话: 如何把一个 "小view" 或者 "小fragment" 覆盖到一个 "全屏view" 之上(见下图). 方法一(FrameLayout + layout_marginTop ): <FrameLayout          android:layout_width="match_parent"         android:layout_height="match_parent">

MapView 和ViewPager Fragment切换黑屏问题解决方案

在项目中使用的是高德地图,放置MapView的Fragment和其他Fragment放置一个ViewPager中切换:当从MapView的Fragment切换到其他Fragment或者从其他Fragment切换到MapView就会产生闪黑边.网上有说什么设置白色背景或者设置Activity style透明.经尝试设置Activity style透明是可以解决闪黑边问题的,但是Activity透明后会看到Launcher桌面.所以这种方式也是的. 我通过修改ViewPager的过渡方式完美解决闪黑

Fragment 切换问题

public void switchContent(Fragment fragment) { if(mContent != fragment) { mContent = fragment; mFragmentMan.beginTransaction()                .setCustomAnimations(android.R.anim.fade_in, R.anim.slide_out)   .replace(R.id.content_frame, fragment) // 替

【Android】保存Fragment切换状态

前言 一般频繁切换Fragment会导致频繁的释放和创建,如果Fragment比较臃肿体验就非常不好了,这里分享一个方法. 声明 欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯伯: http://over140.cnblogs.com 正文 一.应用场景 1.不使用ViewPager 2.不能用replace来切换Fragment,会导致Fragment释放(调用onDestroyView) 二.实现 1.xml <LinearLayout x

让多个Fragment 切换时不重新实例化

转自:http://www.yrom.net/blog/2013/03/10/fragment-switch-not-restart/ 让多个Fragment 切换时不重新实例化 在项目中需要进行Fragment的切换,一直都是用replace()方法来替换Fragment: 1 2 3 4 5 6 7 8 9 public void switchContent(Fragment fragment) { if(mContent != fragment) { mContent = fragment

fragment切换刷新 及下拉刷新

此工程较BaiduLocationXMLFragmentDB相比:1.滑动fragment自动刷新该fragment2.下拉刷新fragment,上拉暂未实现 a.fragment切换刷新 1 . 由于运行进入是fragment1,会默认加载fragment2,但是加载的时候,获取的得到地址天气信息并没有存入数据库中,所以切换到fragment2时不会执行OncreateView再次加载fragment2(刷新方法写在OncreateView),从而不会显示刚存入数据库的数据 首先说明下view

两层Fragment嵌套,外层Fragment切换时内层Fragment不显示内容

尊重他人劳动成果,转载请说明出处:http://blog.csdn.net/bingospunky 需求 在搭界面有这么样一个需求:需要两层的Fragment嵌套,内层需要滑动切换效果,外层界面不需要滑动效果.那么内层使用ViewPager切换,外层就使用replace切换.这样搭出来的界面不能得到需要的效果,内层的Fragment只有第一次能显示内容,之后切换外层Fragment时,内层Fragent都是空着的. 我再尝试两层Fragment都使用replace切换,这样就能达到效果了.但是项