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 }