package com.dpt.tbase.app.base.utils; import java.lang.reflect.Constructor; import java.util.HashMap; import java.util.Map; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import com.dpt.tbase.app.fragment.TBaseFragment; public class TFragmentFactory { private static final String TAG=TFragmentFactory.class.getSimpleName(); private static final Map<String, Class<? extends TBaseFragment>> fraKeys = new HashMap<String, Class<? extends TBaseFragment>>(); private static TFragmentFactory mInstance; private TFraLruCache mTFraCache; private TFragmentFactory(int maxSize, FragmentManager fragmentManager) { mTFraCache = new TFraLruCache(maxSize, fragmentManager); } public static synchronized TFragmentFactory initFractory(int maxSize, FragmentManager fragmentManager) { if (mInstance == null) { mInstance = new TFragmentFactory(maxSize, fragmentManager); } return mInstance; } public static TFragmentFactory getInstance() { return mInstance; } private TBaseFragment createFragment(String fraKey) { return createFragment(fraKeys.get(fraKey)); } private TBaseFragment createFragment(Class<? extends TBaseFragment> fragmentClass) { Constructor<?> constructor; TBaseFragment fragment = null; if (fragmentClass != null) { try { constructor = fragmentClass.getConstructor(new Class[0]); fragment = (TBaseFragment) constructor.newInstance(new Object[0]); } catch (Exception e) { e.printStackTrace(); } } return fragment; } /** * if true {@link #createFragment(Class)} return newInstance else {@link TFragmentFactory#createFragment(Class)} throw exception * @param fraKey {@link TBaseFragment#getKey()} */ public TBaseFragment putAndAddCache(String fraKey, Class<? extends TBaseFragment> clazz) { put(fraKey, clazz); TBaseFragment tfra = createFragment(clazz); if (tfra != null) { mTFraCache.put(fraKey, tfra); } return tfra; } public void put(String fraKey, Class<? extends TBaseFragment> clazz) { fraKeys.put(fraKey, clazz); } public void refreshLruCache(String fraKey, TBaseFragment fragment) { if (fragment.isAddCache()) { mTFraCache.get(fraKey); } } public TBaseFragment get(String fraKey) { Fragment fragment = mTFraCache.get(fraKey); if (fragment == null) { fragment = createFragment(fraKey); } return (TBaseFragment) fragment; } public boolean isAdd(String key){ return fraKeys.get(key)!=null; } }