以前實現Fragment的切換都是用replace方法實現
public void startFragmentAdd(Fragment fragment) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.replace(R.id.main_layout, fragment, fragment.getClass().getName()) .commit(); }
replace()方法只是在上一個Fragment不再需要時采用的簡便方法。因此,每次切換的時候,Fragment都會重新實例化,重新加載數據。
如果要實現Fragment 切換時不重新實例化,正確的切換方式是add(),切換時hide()當前,add()另一個Fragment;再次切換時,只需hide()當前,show()另一個。
// fragment的切換 private void startFragmentAdd(Fragment fragment) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager .beginTransaction(); if (current_fragment == null) { fragmentTransaction.add(R.id.main_layout, fragment).commit(); current_fragment = fragment; } if (current_fragment != fragment) { // 先判斷是否被add過 if (!fragment.isAdded()) { // 隱藏當前的fragment,add下一個到Activity中 fragmentTransaction.hide(current_fragment) .add(R.id.main_layout, fragment).commit(); } else { // 隱藏當前的fragment,顯示下一個 fragmentTransaction.hide(current_fragment).show(fragment) .commit(); } current_fragment = fragment; } }