FragmentHelper

  1 package com.icitymobile.anda.util;
  2 
  3 import java.lang.ref.SoftReference;
  4 import java.util.ArrayList;
  5 import java.util.HashMap;
  6 import java.util.Iterator;
  7 import java.util.Map;
  8 import java.util.Map.Entry;
  9 
 10 import android.content.Context;
 11 import android.content.Intent;
 12 import android.os.Bundle;
 13 import android.support.v4.app.Fragment;
 14 import android.support.v4.app.FragmentManager;
 15 import android.support.v4.app.FragmentTransaction;
 16 
 17 import com.hualong.framework.log.Logger;
 18 
 19 /**
 20  * Fragment帮助类
 21  */
 22 public class FragmentHelper {
 23 
 24     public static final String TAG = "FragmentHelper";
 25 
 26     private static final String STATE_IDS = "fragment_ids";
 27     private static final String STATE_CURRENT_FRAGMENT_ID = "current_fragment_id";
 28     private static final String STATE_LAST_FRAGMENT = "last_fragment";
 29 
 30     private Context mContext;
 31     private FragmentManager mManager;
 32     private int mContainerId;
 33 
 34     private Map<String, SoftReference<Fragment>> mFragments = new HashMap<String, SoftReference<Fragment>>();
 35     private String mCurrentFragmentId = null;
 36     private Fragment mLastFragment;
 37 
 38     public FragmentHelper(Context context, FragmentManager manager, int containerId) {
 39         mContext = context;
 40         mManager = manager;
 41         mContainerId = containerId;
 42     }
 43 
 44     public Fragment getFragment(String fragmentId) {
 45         Fragment fragment = null;
 46         SoftReference<Fragment> reference = mFragments.get(fragmentId);
 47         if (reference != null) {
 48             fragment = reference.get();
 49         }
 50         return fragment;
 51     }
 52 
 53     public String getCurrentFragmentId() {
 54         return mCurrentFragmentId;
 55     }
 56 
 57     public Fragment getCurrentFragment() {
 58         return getFragment(getCurrentFragmentId());
 59     }
 60 
 61     public void switchFragment(String id, Intent intent) {
 62         switchFragment(id, intent, -1);
 63     }
 64 
 65     public void switchFragment(String id, Intent intent, int transition) {
 66         if (intent == null) {
 67             return;
 68         }
 69         Fragment newFragment = getFragment(id);
 70         if (mLastFragment == null || mLastFragment != newFragment) {
 71             FragmentTransaction ft = mManager.beginTransaction();
 72             if (mLastFragment != null) {
 73                 ft.hide(mLastFragment);
 74             }
 75             if (newFragment == null) {
 76                 Logger.i(TAG, TAG + ": Instantiate a new fragment " + id);
 77                 String fname = intent.getComponent().getClassName();
 78                 Bundle args = intent.getExtras();
 79                 newFragment = Fragment.instantiate(mContext, fname);
 80                 if (args != null) {
 81                     newFragment.setArguments(args);
 82                 }
 83                 mFragments.put(id, new SoftReference<Fragment>(newFragment));
 84                 ft.add(mContainerId, newFragment, id);
 85             } else {
 86                 Logger.i(TAG, TAG + ": Load an old fragment " + id);
 87                 ft.show(newFragment);
 88             }
 89             if (transition != -1) {
 90                 ft.setTransition(transition);
 91             }
 92             mLastFragment = newFragment;
 93             mCurrentFragmentId = id;
 94             ft.commit();
 95 //            mManager.executePendingTransactions();
 96         }
 97     }
 98 
 99     /**
100      * 在Bundle中保存状态
101      *
102      * @param bundle
103      */
104     public void saveInBundle(Bundle bundle) {
105         if (bundle == null) {
106             return;
107         }
108         Logger.i(TAG, TAG + ": saving in bundle");
109         ArrayList<String> idList = new ArrayList<String>(mFragments.keySet());
110         bundle.putStringArrayList(STATE_IDS, idList);
111 
112         Iterator<Entry<String, SoftReference<Fragment>>> iter = mFragments.entrySet().iterator();
113         Entry<String, SoftReference<Fragment>> entry;
114         SoftReference<Fragment> reference;
115         Fragment fragment;
116         while (iter.hasNext()) {
117             entry = iter.next();
118             reference = entry.getValue();
119             if (reference != null) {
120                 fragment = reference.get();
121                 if (fragment != null) {
122                     mManager.putFragment(bundle, entry.getKey(), fragment);
123                 }
124             }
125         }
126 
127         if (mCurrentFragmentId != null) {
128             bundle.putString(STATE_CURRENT_FRAGMENT_ID, mCurrentFragmentId);
129         }
130 
131         if (mLastFragment != null) {
132             mManager.putFragment(bundle, STATE_LAST_FRAGMENT, mLastFragment);
133         }
134     }
135 
136     /**
137      * 在Bundle中保存状态,只保存当前的fragment
138      *
139      * @param bundle
140      */
141     public void saveStateSimple(Bundle bundle) {
142         if (bundle == null) {
143             return;
144         }
145         Logger.i(TAG, TAG + ": saving in bundle simple");
146 
147         if (mCurrentFragmentId != null) {
148             bundle.putString(STATE_CURRENT_FRAGMENT_ID, mCurrentFragmentId);
149 
150             ArrayList<String> idList = new ArrayList<String>(1);
151             idList.add(mCurrentFragmentId);
152             bundle.putStringArrayList(STATE_IDS, idList);
153 
154             Fragment currentFragment = getCurrentFragment();
155             if (currentFragment != null) {
156                 mManager.putFragment(bundle, mCurrentFragmentId, currentFragment);
157             }
158         }
159 
160         if (mLastFragment != null) {
161             mManager.putFragment(bundle, STATE_LAST_FRAGMENT, mLastFragment);
162         }
163     }
164 
165     /**
166      * 从Bundle中恢复状态
167      *
168      * @param bundle
169      */
170     public void restoreFromBundle(Bundle bundle) {
171         if (bundle == null) {
172             return;
173         }
174         Logger.i(TAG, TAG + ": restoring from bundle");
175         ArrayList<String> idList = bundle.getStringArrayList(STATE_IDS);
176         if (idList != null) {
177             Fragment fragment;
178             for (String id : idList) {
179                 fragment = mManager.getFragment(bundle, id);
180                 if (fragment != null) {
181                     mFragments.put(id, new SoftReference<Fragment>(fragment));
182                 }
183             }
184         }
185 
186         String currentId = bundle.getString(STATE_CURRENT_FRAGMENT_ID);
187         if (currentId != null) {
188             mCurrentFragmentId = currentId;
189         }
190 
191         Fragment lastFragment = mManager.getFragment(bundle, STATE_LAST_FRAGMENT);
192         if (lastFragment != null) {
193             mLastFragment = lastFragment;
194         }
195     }
196 }

 

posted @ 2016-01-07 14:11  鲸歌  阅读(210)  评论(0编辑  收藏  举报