转载请注明出处:http://blog.csdn.net/llew2011/article/details/51287396
在上篇文章Android 源码系列之<五>从源码的角度深入理解LayoutInflater.Factory之主题切换(中)我们实现了在当前Activity进行主题切换的功能,如果你还没阅读过上篇文章请点击这里,在上篇文章结尾阐述了其中的不足,比如代码通用性以及页面跳转之后进行主题切换,返回之后无效果等,这篇文章主要是来解决以上问题的。
首先解决一下通用性的问题,在上文中如果Activity要实现主题切换都要写一遍设置LayoutInflater的Factory逻辑,这个太麻烦了,假如我们APP中有一大堆Activity的话那不岂要写一大遍重复代码了?这不是我们的风格,因此先要提取这部分代码放入基类BaseActivity中,然后子类直接继承BaseActivity基类就好,代码如下:
public abstract class BaseActivity extends Activity {
protected LayoutInflater mInflater;
protected SkinFactory mFactory;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mFactory = new SkinFactory();
mInflater = getLayoutInflater();
mInflater.setFactory(mFactory);
}
}
BaseActivity中实现了设置LayoutInflater的Factory功能,在之后的开发中所有的Activity就直接继承BaseActivity也就具备了主题切换的功能了。然后我们再来看一下之前BackgroundAtt的实现:
public class BackgroundAttr extends BaseAttr {
@Override
public void apply(View view) {
if(null != view) {
if(RES_ENTRY_TYPE_COLOR.equalsIgnoreCase(entryType)) {
view.setBackgroundColor(SkinManager.getInstance().getColor(attrValue));
} else if(RES_ENTRY_TYPE_DRAWABLE.equalsIgnoreCase(entryType)) {
view.setBackgroundDrawable(SkinManager.getInstance().getDrawable(attrValue));
}
}
}
}
BackgroundAttr的实现就是来更改背景的,根据当前View的entryType来判断类型,如果是更改背景颜色就调用setBackgroundColor()方法,否则如果是更改背景图就调用setBackgroundDrawable()方法,那每一个BaseAttr的实现都需要做一次判断代码就是冗余了,所以可以把判断类型加入到基类BaseAttr中实现,代码如下:
public abstract class BaseAttr {
public String attrName;
public int attrValue;
public String entryName;
public String entryType;
boolean isDrawableType() {
return "drawable".equalsIgnoreC