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