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();