Android应用程序换肤实现系列(二)

转载请标明出处: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值