zoukankan      html  css  js  c++  java
  • 对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();
    	}
  • 相关阅读:
    newcoder 筱玛的迷阵探险(搜索 + 01字典树)题解
    str&repr的使用&format模板的自定义
    内置函数的补充与getattrebuit & item系列
    python几种常用模块
    面向对象的反射&动态导入模块
    面向对象的封装&定制数据类型
    面向对象的多态
    面向对象的继承
    面向对象的属性与方法
    面向对象的属性及类的增删改查
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/6026473.html
Copyright © 2011-2022 走看看