昨天去听了CSDN举办的android开发讲座,其中讲到了应用皮肤与系统皮肤的更换方式,在这里总结下。
应用皮肤更换:
1.将皮肤资源内置到应用中。这种方式较为死板,即应用发布时就确定了有哪些皮肤可用。如果要发布新的皮肤,就要重新发布应用。另外,将所有皮肤放在应用中,会使应用安装包比较大。
2.通过下载的方式。即皮肤的资源文件并不是放在资源文件中,而是在用户选择了一种皮肤后,由程序下载该皮肤的资源文件。
这里资源文件又可以分为两种格式,一种是.apk型的资源文件。这种方式的原理是:如果不同android应用程序的android:sharedUserId属性相同,那么应用程序之间可以共享资源文件。举例如下:
建立两个工程:TestSkin1与TestSkin2。这里默认TestSkin1是主程序,TestSkin2是皮肤资源。TestSkin1里面有一个button,需要使用TestSkin2里面的资源作为背景。
TestSkin1的AndroidManifest.xml文件如下修改:
<?xml version="1.0"encoding="utf-8"?>
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
package="com.mainskin"
android:versionCode="1"
android:versionName="1.0"
android:sharedUserId="com.test.skin">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".TestSkin1"
android:label="@string/app_name">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
TestSkin2的AndroidManifest.xml文件如下修改:
<?xml version="1.0"encoding="utf-8"?>
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
package="com.myskin"
android:versionCode="1"
android:versionName="1.0"
android:sharedUserId="com.test.skin">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".TestSkin2"
android:label="@string/app_name">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
TestSkin1的Activity中对Button的声明:
ContextfriendContext=null;
try{
friendContext= this.createPackageContext("com.myskin", Context.CONTEXT_IGNORE_SECURITY);
}catch (NameNotFoundException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
Drawable aa=friendContext.getResources().getDrawable(R.drawable.icon);
Button button=(Button)findViewById(R.id.button1);
button.setBackgroundDrawable(aa);
在两个工程的drawable下放置两张名字同为icon的图片,但是图片的内容不同。
第二种应用换肤的方式是使用.zip文件保存资源文件。即软件在下载.zip包后,将其解压缩到某个位置,然后在程序中按照该位置访问资源。这种方式需要在程序中手动维护资源的路径,较为不方便。