Android — Fragment註意事項

ViewPager+Fragment                                                                

 

讓Fragment成為ViewPager的一頁時,FragmentManager會一直保存管理創建好瞭的Fragment,即使當前不是顯示的這一頁,Fragment對象也不會被銷毀,在後臺默默等待重新顯示。但如果Fragment不再可見時,它的視圖層次會被銷毀掉,下次顯示時視圖會重新創建。

 

出於使用FragmentPagerAdapter  時,Fragment對象會一直存留在內存中,所以當有大量的顯示頁時,就不適合用FragmentPagerAdapter 瞭,FragmentPagerAdapter  適用於隻有少數的page情況,像選項卡。這個時候你可以考慮使用FragmentStatePagerAdapter ,當使用FragmentStatePagerAdapter  時,如果Fragment不顯示,那麼Fragment對象會被銷毀,但在回調onDestroy()方法之前會回調onSaveInstanceState(Bundle outState)方法來保存Fragment的狀態,下次Fragment顯示時通過onCreate(Bundle savedInstanceState)把存儲的狀態值取出來,FragmentStatePagerAdapter  比較適合頁面比較多的情況,像一個頁面的ListView。

 

動畫                                                                                    

 

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(漸變)效果。

 

復制代碼

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瞭。

 

保存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;

}

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *