對Fragment切換的優化
來源:程序員人生 發布時間:2014-12-18 08:33:21 閱讀次數:3403次
在項目中需要進行Fragment的切換,1直都是用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();
}
但是,這樣會有1個問題:
每次切換的時候,Fragment都會重新實例化,重新加載1邊數據,這樣非常消耗性能和用戶的數據流量。
就想,如何讓多個Fragment彼此切換時不重新實例化?
翻看了Android官方Doc,和1些組件的源代碼,發現,replace()這個方法只是在上1個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下1個到Activity中
transaction.hide(from).add(R.id.fl_main, to).commit();
} else {
// 隱藏當前的fragment,顯示下1個
transaction.hide(from).show(to).commit();
}
// 讓menu回去
menu.toggle();
}
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈