fragment切換有兩種方式 1 :用add hide show (有利於保持fragment 中view的狀態) 2 :replace
方法1:
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.hide(Fragment1);
ft.add(R.id.simple_fragment, Fragment2);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
Fragment1不走任何生命周期,但會調onHiddenChanged方法
Fragment2 onCreate > onCreateView > onStart >onResume
回到Fragment1,Remove Fragment2:
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.remove(Fragment2);
ft.show(Fragment1);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
Fragment1還是不走任何生命周期,調onHiddenChanged方法
Fragment2 onPause > onStop >onDestoryView >onDestory
用這種方法切換,Fragment在隱藏時並不會走onDestoryView,所以顯示時也不會走onCreateView,所有View都一直保存在內存中。
方法2:replace
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.simple_fragment, Fragment2);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
Fragment1 onPause > onStop >onDestoryView >onDestory
Fragment2 onCreate >onCreateView >onStart > onResume
replace 中 在 commit 前加入 ft.addToBackStack(null);
那么可以把原來的Fragment放入棧中,走onDestoryView方法,但不會onDestory,返回時,直接onCreateView,不再onCreate.
返回直接調用popBackStack()方法:
getFragmentManager().popBackStack();