【Fragment精深系列7】Fragment切換優化
阿新 • • 發佈:2019-02-10
一、Fragment+RadioGroup
在專案中需要進行Fragment的切換,一直都是用replace()方法來替換Fragment:然後總感覺切換的時候有些卡頓。
1、以前的程式碼:
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup radioGroup, int checkID) {
switch (checkID) {
case R.id .rabt01:
if (searchFragment == null) {
searchFragment = new SearchFragment();
getSupportFragmentManager().beginTransaction().hide().add(R.id.linnerlayout, searchFragment).commit();
}
break ;
case R.id.rabt02:
downFragment = new DownFragment();
getSupportFragmentManager().beginTransaction().replace(R.id.linnerlayout, downFragment).commit();
break;
case R.id.rabt03:
listenFragment = new ListenFragment();
getSupportFragmentManager().beginTransaction().replace(R.id.linnerlayout, listenFragment).commit();
break;
case R.id.rabt04:
myFragment = new MyFragment();
getSupportFragmentManager().beginTransaction().replace(R.id.linnerlayout, myFragment).commit();
break;
}
}
});
2、原因分析:
因為replace每次都會重新呼叫fragment的onCreateView()方法,浪費時間。
3、解決方法:
正確的切換方式是add(),切換時hide(),add()另一個Fragment;再次切換時,只需hide()當前,show()另一個。這樣就不會重複呼叫onCreateView函數了。
FragmentTransactioin 可以用來新增,刪除fragment,也可以控制fragment的顯示和隱藏。
這是如果呼叫addToBackStack(null),此時的狀態就會被儲存在回退棧,按返回鍵的時候就會顯示出棧頂的。
4、程式碼改進
需要維護一個全域性的變數來記錄當前的fragment。另外需要做一些判斷,可以提取成方法的。