三个开源的项目:
当前更换主题的方式如下:
Theme:
设置Theme来切换不同主题。
优点:利用系统自带的机制实现,根据标志位setTheme()即可。
缺点:在主题切换界面不重启的情况下,不能自动完成界面主题的刷新。
遍历view:
对主题的更换,使用遍历View,然后单独设置更改后的属性即可。
优点:可以即时更新界面,不需要重启Activity
缺点:需要单独添加标志位,来标记需要更换主题的View,需要增加额外工作,另外就是标记的添加,有可能影响原来的代码逻辑。
项目一:MultipleTheme
这个项目的实现方案比较好理解,采用的是Theme+遍历更新View的思路。
步骤一:
public class BaseActivity extends Activity{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(SharedPreferencesMgr.getInt("theme", 0) == 1) {
setTheme(R.style.theme_2);
} else {
setTheme(R.style.theme_1);
}
}
}
步骤二:
ColorUiUtil.changeTheme(rootView, getTheme());
步骤三:
public interface ColorUiInterface {
public View getView();
public void setTheme(Resources.Theme themeId);
}
以上操作会是成本较高的方案。
而且就目前来说,Demo里面存在BUG,点击切换皮肤之后,Button的字体颜色换了,但是背景颜色却消失了,同时这个项目已经4个月没有维护。
结论:不推荐
项目二:Colorful
Colorful与上面一种方案总体思想是相通的,但是在具体实现细节上各有特色。
首先在需要更换主题View的筛选上,上面的方案用的是是否实现某接口来识别,而在Colorful中则是需要用户手动绑定,建立需要更换的View与属性之间关系,虽然在编码上面需要花费一些时间,但是这样就不需要替换所有的View,在总体上是优于前一种方案。
项目三:AndroidChangeSkin
AndroidChangeSkin这个库不单单可以完成应用内资源的替换,还可以完成外部apk资源包的主题加载