Fragment保持狀態切換


在使用Activity管理多個Fragment時,每次切換Fragment使用的是replace,結果導致出現xxx is not currently in the FragmentManager異常掛掉

網上說使用replace切換會使被切換的Fragment給替換掉,從而被被切換的Fragment的view從viewtree中刪除,致使切換過程中每次都要重新創建Fragment

每次使用add添加Fragment,當再次切換到時用show顯示,而被切換的Fragment用hide隱藏,具體代碼如下:

 1     /**
 2      * Fragment跳轉
 3      * @param fm
 4      * @param fragmentClass
 5      * @param tag
 6      * @param args
 7      */
 8     public void turnToFragment(Class<? extends Fragment> fromFragmentClass, Class<? extends Fragment> toFragmentClass, Bundle args) {
 9         
10         FragmentManager fm = getSupportFragmentManager();
11         //被切換的Fragment標簽
12         String fromTag = fromFragmentClass.getSimpleName();
13         //切換到的Fragment標簽
14         String toTag = toFragmentClass.getSimpleName();
15         //查找切換的Fragment
16         Fragment fromFragment = fm.findFragmentByTag(fromTag);
17         Fragment toFragment = fm.findFragmentByTag(toTag);
18         //如果要切換到的Fragment不存在,則創建
19         if (toFragment == null) {
20             try {
21                 toFragment = toFragmentClass.newInstance();
22                 toFragment.setArguments(args);
23             } catch (java.lang.InstantiationException e) {
24                 e.printStackTrace();
25             } catch (IllegalAccessException e) {
26                 e.printStackTrace();
27             }
28         }
29         //如果有參數傳遞,
30         if( args != null && !args.isEmpty() ) {
31             toFragment.getArguments().putAll(args);
32         }
33         //Fragment事務
34         FragmentTransaction ft = fm.beginTransaction();
35         //設置Fragment切換效果
36         ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out,
37                 android.R.anim.fade_in, android.R.anim.fade_out);
38         /**
39          * 如果要切換到的Fragment沒有被Fragment事務添加,則隱藏被切換的Fragment,添加要切換的Fragment
40          * 否則,則隱藏被切換的Fragment,顯示要切換的Fragment
41          */
42         if( !toFragment.isAdded()) {
43             ft.hide(fromFragment).add(R.id.content_frame, toFragment, toTag);
44         } else {
45             ft.hide(fromFragment).show(toFragment);
46         }
47         //添加到返回堆棧
48 //        ft.addToBackStack(tag);
49         //不保留狀態提交事務
50         ft.commitAllowingStateLoss();
51     }

 這里有個FragmentTransaction(事務),這個是Fragment切換的核心類,它有兩個方法:replace,add,一個是替換Fragment,一個是添加Fragment,兩者的區別是:replace=remove掉舊fragment,add新的fragment,

當我們的應用(即管理多個Fragment的Activity)運行到后台時(即推出當前屏幕),會觸發Activity的onPause()方法,而Activity的onPause()會調用它所管理的Fragment的同樣的方法,但是當我使用replace時,已經remove掉了原來的Fragment,所以當調用原理的Fragment的onPause()方法就回不粗在,就會出現上述xxx is not currently in the FragmentManager的異常推出,有debug為證:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM