Android -- Fragment注意事項

ViewPager+Fragment                                                                

讓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 }    

Menu                                                                                   

1 @Override
2     public void onCreate(Bundle savedInstanceState) {
3         super.onCreate(savedInstanceState);
4         setHasOptionsMenu(true);
5     }

這樣以後,就能夠調用onCreateOptionsMenu了。spa

保存Fragment的切換                                                                 

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;
}

 

我是天王蓋地虎的分割線                                                             

相關文章
相關標籤/搜索