Android主题切换方案总结
?从上面的xml文件的内容可以看到,attr里可以定义各种属性类型,如color、float、integer、boolean、dimension(sp、dp/dip、px、pt...)、reference(指向本地资源)等等。
1.2定义主题接着,我们需要在资源文件中定义若干套主题。并且在主题中设置各个属性的值。
本例中,我在styles.xml里定义了SwitchTheme1与SwitchTheme2。
1.3在布局文件中使用定义好了属性,我们接下来就要在布局文件中使用了。
为了使用主题中的属性来配置界面,我定义了一个名为activity_theme_switch.xml布局文件。
?从这个布局文件中可以看到,我在id为themeColor、themeText及theme_image的控件上,分别使用了?attr/colorValue、?attr/stringValue与?attr/referenceValue来引用主题中的颜色值、字符串以及图片。
1.4设置主题及布局文件?布局文件与主题都写好了,接下来我们就要在Activity的onCreate方法里使用了。
为了显示两种主题的效果,我写了一个DemoStyleThemeActivity。根据useThemeBlack来设置不同的主题。没打开一次DemoStyleThemeActivity,useThemeBlack就会取反。这样,只要打开两次,就能看到不同的效果了。代码如下:
?1.5在代码中获取主题资源当然,有的人就要问了,如果我想在代码里获取主题中的资源该怎么办啊?毕竟整数、浮点数、布尔值这些东西在布局文件里没地方用啊。
很简单,要想在代码中获取当前设置的主题的属性值,我们只需要使用Context.obtainStyledAttributes就行了。
还记得1.1里定义的那些属性名吧,Android在编译R.java时为每一个属性都分配了一个标识。我们只需要将这些标识的数组传给obtainStyledAttributes就行了。
然后,我们就能获得一个TypedArray对象。通过它的getXXX方法就能获取到各种属性值了。
代码如下:
2.APK主题内置主题虽然可以很方便地修改界面,并且不需要怎么改代码。但它有一个比较致命的缺陷,就是一旦程序发布后,应用所支持的主题风格就固定了。要想增加更多的效果,只能发布新的版本。
为了解决这种问题,便有了APK主题方案。
APK主题方案很像之前提到的第一种将主题包保存到SD卡上的方案很像。
它们的共同点是,都需要在代码中手动设置图片、文字、颜色等信息。
主要的区别就是,第一种方案需要我们自行编写资源解析的方法。而通过APK主题方案,可以让Android系统帮我们搞定。
APK主题方案的基本思路是:在Android中,所有的资源都是基于包的。资源以id进行标识,在同一个应用中,每个资源都有唯一标识。但在不同的应用中,可以有相同的id。因此,只要获取到了其他应用的Context对象,就可以通过它的getRsources获取到其绑定的资源对象。然后,就可以使用Resources的getXXX方法获取字符串、颜色、dimension、图片等。
要想获取其他应用的Context对象,Android已经为我们提供好了接口。那就是android.content.ContextWrapper.createPackageContext(String packageName, int flags)方法。
实例代码如下:
?