Android 源码系列之<六>从源码的角度深入理解LayoutInflater.Factory之主题切换(下)

本文是Android源码系列的第六篇,主要探讨如何改进上篇中主题切换的通用性问题。通过将主题切换逻辑抽象到基类BaseActivity,解决了大量重复代码的问题。同时,引入ISkinUpdate接口缓存Activity实例,实现在主题切换后通知Activity响应。针对V7的AppCompatActivity可能出现的异常,使用反射避免再次设置Factory。最后,讨论了内存泄露问题,提出在Activity的onDestroy()中清理Factory缓存以防止内存泄漏。文章提供了实验效果对比和QQ主题切换界面的模仿示例,源码可供下载。
摘要由CSDN通过智能技术生成

        转载请注明出处: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
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值