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