在进行项目开发中,由于多个应用都需要用到播放器,因此公司要求统一播放器,并进行规范化。在第一次剥离时,库主要包含操控行为,且操控行为均在Fragment中进行处理。对于非播放行为,在具体应用中进行扩展。这时候问题出现了:对Fragment进行扩展后,activity需要更换Fragment。
解决此问题想到2种方法:
1.同时对activity进行扩展,基类提供替换原Fragment方法。如果播放器库中存在其他页面,也需调用播放activity,此时对于每个应用来说,就必须对播放器库中涉及播放activity的类全部进行重写,非常麻烦。这里主要介绍第二种方法,以便后续学习和回顾。
2.第二种方法主要学习于actionbarsherlock开源库。在播放器库中提供操控fragment帮助类,以Helper为例。
public abstract class Helper {
public static final int BASIC = 1;
public static final int EXTENDS = 2;
private static SparseArray<Class<? extends Helper>> implMap = new SparseArray<Class<? extends Helper>>();
static {
implMap.put(BASIC, BaseHelperImpl.class);
}
protected static void registerImpl(Class<? extends Helper> implClass) {
implMap.put(EXTENDS, implClass);
}
public static SparseArray<Class<? extends Helper>> getImpl() {
return implMap;
}
public abstract Fragment getFragment(Context context, Bundle bundle);
}
默认情况下使用basic。若需扩展,则对helper添加实现。在播放activity中可以通过以下定义。
private Helper mHelper;
protected Helper gethelper() {
if (mHelper == null) {
SparseArray<Class<? extends Helper>> impls = Helper.getImpl();
Constructor<? extends Helper> ctor = null;
try {
if (impls.size() == 1) {
ctor = impls.get(Helper.BASIC).getConstructor();
} else {
ctor = impls.get(Helper.EXTENDS).getConstructor();
}
return ctor.newInstance();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
return mHelper;
}
在添加Fragment的地方,只需getHelper.getFragment(this,bundle);即可使用上扩展的fragment类了。
完整的demo地址为:http://download.csdn.net/detail/hpb21/7573235