转载请标明出处: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>        <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">        -- Customize your theme here. -->    style>    <style name="AppTheme1" parent="AppTheme">        <item name="themeIconDrawable">@drawable/bg1    style>    <style name="AppTheme2" parent="AppTheme">        <item name="themeIconDrawable">@drawable/bg2    style>resources>

第二步,自定义属性项,在attr.xml 增加属性(示例如下:),然后在不同主题中对应不同资源或者颜色,尺寸等特征,

 "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

更多相关文章

  1. Android(安卓)Studio使用技巧-看这一篇就够了-每个技巧都用得上
  2. android fragmnet重叠问题解决方案
  3. Android四大核心组件之一-----Service(服务)的基本知识
  4. 旋屏时,OnCreate方法重复调用的解决
  5. React Native调用Android原生方法
  6. android仿iPhone滚轮控件实现及源码分析(二)
  7. 采用回调Activity的形式创建AlertDialog单选列表框
  8. Activity的启动流程分析
  9. Android获取控件宽高的几种方式

随机推荐

  1. iOS和Android的设计指南
  2. Eclipse Android(安卓)SDK content Loade
  3. Android上jni c++使用MediaCodec的方法
  4. FTP-Android客户端实现笔记
  5. Android(安卓)获取本机的mac和wifi的BSSI
  6. Android(安卓)Service详解
  7. Android(安卓)使用ZXing接入扫描二维码遇
  8. Android(安卓)性能优化&内存篇
  9. 关于在 Android(安卓)EditText 控件 中过
  10. 原生Android何去何从