转载请标明出处:http://blog.csdn.net/edisonchang/article/details/50041709
本节主要介绍android 主流换肤的第一种方式,通过android theme主题的概念动态切换主题改变皮肤 ,几种换肤方式的特点读者可以通过阅读前一篇博文了解 。
在介绍实现方法之前,首先了解下此种换肤方式的一些适用场景。由于运用主题换肤实现换肤的方法,实现过程中必须预置更换皮肤资源,由xml定义好所有皮肤,切换时再调用android原生切换主题方法进行换肤,这样一来,有以下一些场合是受限的:
(1)皮肤需要动态增加和扩展
(2)切换主题涉及较多的图片资源
因为资源一多而且内置会导致安装文件增大,这一点是比较难以容忍的。那么什么场景下适用呢,通过主题换肤的原理我们知道,切换皮肤是通过改变主题的方式,所以如果更换的皮肤以色彩为主,没有太多的图片资源,而且主题种类相对固定,用主题来实现换肤就非常的合适。
了解用Android Theme 更换UI 皮肤的适用场合后,下面介绍下用主题换肤的实现步骤:
通过源码,我们发现android 系统的themes.xml 文件早为应用预置了各种样式的style, 这些主题不仅定义了通用的窗口背景颜色,文字颜色,字体大小等一些元素的通用属性,而且定义了窗体、工具栏样式等 。增加自定义主题时,一般情况下我们可以继承android 某个原生主题,并进行修改 ,这样可以在android 主题原生的基础上,做一些个性化的定制,如下style.xml 文件,我们为换肤准备两套主题:
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
</style>
<style name="AppTheme1" parent="AppTheme">
<item name="themeIconDrawable">@drawable/bg1</item>
</style>
<style name="AppTheme2" parent="AppTheme">
<item name="themeIconDrawable">@drawable/bg2</item>
</style>
</resources>
第二步,自定义属性项,在attr.xml 增加属性(示例如下:),然后在不同主题中对应不同资源或者颜色,尺寸等特征,
<attr name="themeIconDrawable" format="reference" />
增加自定义的属性后,在我们的布局文件中需要切换皮肤的地方就可以直接引用,
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="?attr/themeIconDrawable"
android:layout_centerInParent="true"/>
注意这里我们用?符号来引用资源文件。这里简单说下与@引用资源的区别,
@符号表明引用的资源是之前定义过的,包括android 系统或者其他Library,
而问号?表明了我们引用的资源是在当前的主题中定义过的。
ok,万事俱备了,且看我们的代码如何配置,如下代码,在activity的onCreate 方法setContentView方法或者其他应用布局的inflater 方法调用前,我们优先调用setTheme方法,选择当前activity 所应用的主题。
protected void onCreate(Bundle savedInstanceState) {
//use setTheme before super onCreate
mTheme = getCustomTheme();
setTheme(mTheme);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_theme);
btnChange = (Button) findViewById(R.id.button_change);
btnChange.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
reLoad();
}
});
}
在程序设计时,我们可以将切换主题的方法放在基类,然后所有需要切换主题的activity 都继承于它,这样就可以在切换主题后,就可以同步所有的页面。 这里有一个小细节,在切换主题的时候,其实我们会重启当前的activity,为了使页面切换更加自然,建议切换时抑制切换activity的动画,可以在finish 方法之前加上overridePendingTransition(0, 0),
private void reLoad() {
saveTheme();
Intent intent = getIntent();
overridePendingTransition(0, 0);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
overridePendingTransition(0, 0);
startActivity(intent);
}
当前应用的主题可以用SharedPreferences进行保存,这样就可以确保切换后的主题在重启应用后依然生效。到这里,第一种换肤方式就基本介绍完,实现过程应该不难理解,
有任何疑问可以回复,欢迎继续关注换肤系列的下一篇
源码下载请点击此,欢迎下载,star