android 切换主题介绍二

原文出自:Spring sky ,欢迎转载,请保留版权和原文地址 http://blog.csdn.net/springsky_/article/details/24480289  

在这篇文章前,我写过一篇以apk为插件方式切换主题的文章,那么当你的boss不接受安装方式该怎么办?

下面,我将要介绍另外一种方式,就是把资源文件打包在主程序的方式,该方式的分析具体如下:

简介:把主工程中,使用不同的style方式,去加载不同的资源文件(也许听起来很模糊,下面会详细介绍)

优点:速度快,效率高,不需要额外的安装包,避免的安装、下载等繁琐的问题,不用修改java程序代码,方便,快捷。

缺点:造成资源包很大,不适合版本控制,每次切换都需要重新OnCreate Activity。

下面,我们来介绍相关的关键技术:1.自定义我们的attr 对象: 自定义attr,首先需要在values的文件夹中创建一个attrs.xml文件,然后对相关的attr进行配置。这个简单的介绍一下attr的意思,这个是自定义属性的意思,主要用于自定义控件方面,同时我们可以自定义他为皮肤的属性名称.

具体创建如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <attr name="page_bg" format="reference" />
    <attr name="btn_bg" format="reference" />

</resources>

上面就是我自定义两个属性,一个界面背景和一个按钮背景

 

2.定义style主题定义主题这块,目前网上很多文章,都写得很简洁,对于不熟悉的人来说,真心的看不懂,也不提供demo给初学者实践,所以这点很容易让那些意向不坚定的人否决了这种方式,那么具体的应该是:

 

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">

    <style name="Theme.Default" parent="@android:style/Theme.NoTitleBar.Fullscreen">
        <item name="page_bg">@drawable/page_bg</item>
        <item name="btn_bg">@drawable/btn_item_bg</item>
    </style>
    <!-- 夜色朦胧主题 -->
    <style name="Theme.Ysml" parent="@android:style/Theme.NoTitleBar.Fullscreen">
        <item name="page_bg">@drawable/ysml_page_bg</item>
        <item name="btn_bg">@drawable/ysml_btn_item_bg</item>
    </style>

</resources>

上面我定义了两个主题: Theme.Default是默认主题 Theme.Ysml 是夜色朦胧的主题。

 

在两个主题中,有两个item,分辨是page_bg和btn_bg ,其实这里的属性,就是我们在上面定义的attr,这一点,网上的文章没说清楚,导致了很多初学者不理解或者直接到这里就提示错误。所以,笔者特别的提醒一下大家,希望能解决初学者心中的疑惑。

从page_bg和btn_bg中我都设置了他为我们资源中的两个图片,其实这里可以定义其他的类型,比如:@color @anim 。如果我们需要要做好一个项目,那么就不能按照我这样写了,应该是定义额外的style 来引用,这里就不做具体说明,思维很重要,只要你懂得去简化程序,你就能明白。

3.怎么使用我们的自定义属性?如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="?page_bg"
    android:gravity="center"
    android:orientation="vertical" >

    <Button
        android:id="@+id/set_default_theme"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?btn_bg"
        android:gravity="center"
        android:text="设置为默认主题" />

    <Button
        android:id="@+id/set_ys_theme"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?btn_bg"
        android:gravity="center"
        android:text="设置为夜色主题" />

</LinearLayout>

在这个layout中,我们的背景中使用了:”?page_bg“,这就是使用图片资源了。当然,当你的属性里面定义的是color,也可以直接调用的,这里就不多做解释,举一反三,多实践吧同学们。

 

其实这算是一个隐式的引用关系,因为我们不知道调用哪个主题的资源来显示。那么我们怎么去告诉程序,我要显示哪一个主题?4.调用主题?

目前有两种使用主题的方式No.1 在AndroidManifest.xml 中配置主题,对一个activity中设置它的:android:theme="" 属性即可,可是,我们是为了动态的调用主题方式,所以这种方式,显然否决了!

No.2 在Activity中设置,方法:在Activity的onCreate方式中调用:setTheme(theme) 方法,特别注意,该方法必须在调用setContentView之前调用。这里我再额外说两句,如果我们写一个BaseActivity的话,在onCreate中调用一下setTheme方法,那么是不是会简化我们的代码?吐舌头


那么具体,就看看我们运行的效果:1.默认主题:


2.夜色朦胧主题:


 

总结:总体来说,该方式应该在很多公司容易接受,但是优缺点我也说了,可能每个人的想法不一致,呵呵,主要的是我们能熟悉懂得技术,需要的时候我们立马解决问题就ok,对自己的提升也是一个不错的实践。如有疑问请联系我。


具体代码:http://download.csdn.net/detail/vipa1888/7252141


 


 

posted @ 2014-04-25 16:58  spring_sky  阅读(273)  评论(0编辑  收藏  举报