public void switchContent(Fragment fragment) { if(mContent != fragment) { mContent = fragment; mFragmentMan.beginTransaction() .setCustomAnimations(android.R.anim.fade_in, R.anim.slide_out) .replace(R.id.content_frame, fragment) // 替換Fragment,實現切換 .commit(); }}但是,這樣會有一個問題:每次切換的時候,Fragment都會重新實例化,重新加載一邊數據,這樣非常消耗性能和用戶的數據流量。
就想,如何讓多個Fragment彼此切換時不重新實例化?
翻看了Android官方Doc,和一些組件的源代碼,發現,replace()這個方法只是在上一個Fragment不再需要時采用的簡便方法。
正確的切換方式是
add()
,切換時hide()
,add()
另一個Fragment;再次切換時,只需hide()當前,show()另一個。這樣就能做到多個Fragment切換不重新實例化:onCreate里面:
pickerFragment = new DeckPickerFragment(); fm = getFragmentManager(); baseFragment = fm.findFragmentById(R.id.fragment_main2); ft = fm.beginTransaction(); ft.add(R.id.fragment_main2, pickerFragment);//此處需用add,不能用replace ft.commit(); mContent = pickerFragment;切換的方法:
PRivate Fragment mContent = null; /** * 修改顯示的內容 不會重新加載 * to 下一個fragment * mContent 當前的fragment */ private void switchContent(Fragment to) { if (mContent != to) { FragmentTransaction transaction = getFragmentManager().beginTransaction(); if (!to.isAdded()) { // 判斷是否被add過 // 隱藏當前的fragment,將 下一個fragment 添加進去 transaction.hide(mContent).add(R.id.fragment_main2, to).commit(); } else { // 隱藏當前的fragment,顯示下一個fragment transaction.hide(mContent).show(to).commit(); } mContent = to; } }
新聞熱點
疑難解答