1. 程式人生 > >【Fragment精深系列7】Fragment切換優化

【Fragment精深系列7】Fragment切換優化

一、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。另外需要做一些判斷,可以提取成方法的。

二、ViewPager+Fragment