讓Fragment成爲ViewPager的一頁時,FragmentManager會一直保存管理建立好了的Fragment,即便當前不是顯示的這一頁,Fragment對象也不會被銷燬,在後臺默默等待從新顯示。但若是Fragment再也不可見時,它的視圖層次會被銷燬掉,下次顯示時視圖會從新建立。android
出於使用FragmentPagerAdapter 時,Fragment對象會一直存留在內存中,因此當有大量的顯示頁時,就不適合用FragmentPagerAdapter 了,FragmentPagerAdapter 適用於只有少數的page狀況,像選項卡。這個時候你能夠考慮使用FragmentStatePagerAdapter ,當使用FragmentStatePagerAdapter 時,若是Fragment不顯示,那麼Fragment對象會被銷燬,但在回調onDestroy()方法以前會回調onSaveInstanceState(Bundle outState)方法來保存Fragment的狀態,下次Fragment顯示時經過onCreate(Bundle savedInstanceState)把存儲的狀態值取出來,FragmentStatePagerAdapter 比較適合頁面比較多的狀況,像一個頁面的ListView。app
1 FragmentTransaction ft = getFragmentManager().beginTransaction(); 2 ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 3 ft.replace(R.id.details, detail); 4 ft.addToBackStack(null); 5 ft.commit();
代碼設置的fade(漸變)效果。ide
1 FragmentTransaction ft = getFragmentManager().beginTransaction(); 2 //setCustomAnimations()必須位於replace()以前,不然效果不起所中。它的兩個參數分別爲enter,exit的效果。系統目前提供兩個效果,分別爲android.R.animator.fade_in和android.R.animator.fade_out 3 ft.setCustomAnimations(R.animator.slide_in_left,R.animator.slide_out_right); 4 ft.addToBackStack(null); 5 ft.replace(R.id.details,"detail"); 6 ft.commit();
利用setCustomAnimations()函數
fragment必定要有一個無參構造函數,若是要給fragment傳參,必定要使用Bundle方式傳參,而不重載構造函數傳參,由於在fragment從新生成的使用不會執行這個帶參構造函數,而是執行無參構造函數。動畫
1 public static VechileFrag newInstance(Vehicle vehicle, String userId, boolean isAdd) { 2 VechileFrag mf = new VechileFrag(); 3 Bundle args = new Bundle(); 4 args.putString("userId", userId); 5 args.putBoolean("isAdd", isAdd); 6 args.putParcelable("vehicle", vehicle); 7 mf.setArguments(args); 8 return mf; 9 } 10 11 12 @Override 13 public void onCreate(Bundle savedInstanceState) { 14 super.onCreate(savedInstanceState); 15 Bundle args = getArguments(); 16 if (args != null) { 17 userId = args.getString("userId"); 18 isAdd = args.getBoolean("isAdd"); 19 vehicle = args.getParcelable("vehicle"); 20 if (vehicle == null) { 21 vehicle = new Vehicle(); 22 } 23 } 24 }
1 @Override 2 public void onCreate(Bundle savedInstanceState) { 3 super.onCreate(savedInstanceState); 4 setHasOptionsMenu(true); 5 }
這樣以後,就能夠調用onCreateOptionsMenu了。spa
Fragment fragment = fragments.get(i); if(!fragment.isAdded()) { if(currentIndex!=-1) fragments.get(currentIndex).onPause(); ft = fm.beginTransaction(); ft.setTransition(android.support.v4.app.FragmentTransaction.TRANSIT_FRAGMENT_FADE); ft.add(R.id.framelayout,fragment); // ft.addToBackStack(null); ft.commit(); currentIndex=i; } else { ft = fm.beginTransaction(); fragments.get(currentIndex).onPause(); ft.setTransition(android.support.v4.app.FragmentTransaction.TRANSIT_FRAGMENT_FADE); ft.hide(fragments.get(currentIndex)); ft.show(fragments.get(i)); fragments.get(i).onStart(); ft.commit(); currentIndex=i; }