首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

教你如何做可以换皮肤的软件

2012-08-21 
教你怎么做可以换皮肤的软件网上找了很久,未果。偶然的机会,看到aiMinesweeper.HelloSkin的AndroidManifest

教你怎么做可以换皮肤的软件
网上找了很久,未果。
偶然的机会,看到aiMinesweeper.HelloSkin的AndroidManifest.xml里有那么一个属性:android:sharedUserId="com.artfulbits.aiminesweeper"
顿时感到看到了阳光,马上google了一下,发现了关键的地方。

SharedUserid
拥有同一个User id的多个APK可以配置成运行在同一个进程中,所以默认就是可以互相访问任意数据。也可以配置成运行成不同的进程,同时可以访问其他APK的数据目录下的数据库和文件,就像访问本程序的数据一样。

哈哈,这个就是我要找的东西,马上开始试验。

工程1(主工程)
只有1个画面,包含1个为了测试用的button
AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.test.android.skin.main" android:versionCode="1"android:versionName="1.0" android:sharedUserId="com.test.android.skin"><application android:icon="@drawable/icon" android:label="@string/app_name"><activity android:name=".MainActivity" android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>


MainActivity
@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);Context friendContext = null;try {friendContext = this.createPackageContext("com.test.android.skin.myskin",Context.CONTEXT_IGNORE_SECURITY);} catch (NameNotFoundException e) {e.printStackTrace();}Button btn = (Button) findViewById(R.id.btn);btn.setBackgroundDrawable(friendContext.getResources().getDrawable(R.drawable.btn_background));}


drawable下放一张名为btn_background.pnd的图片

工程2(皮肤工程)
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.test.android.skin.myskin" android:versionCode="1"android:versionName="1.0" android:sharedUserId="com.test.android.skin"><application android:icon="@drawable/icon" android:label="@string/app_name"><activity android:name=".MainActivity" android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest> 


drawable下也放一张名为btn_background.png的图片(换成xml文件就可以实现不同状态不同图片的功能)

把2个工程都安装到模拟器上以后,运行工程1,button上的图片果然是工程2中的btn_background.png,终于成功了。

测试代码(主工程和皮肤工程)已上传,没写注释望见谅。 3 楼 live17909 2011-04-07   能出源码吗 4 楼 live17909 2011-04-11   主工程报图片资源找不到呢。是不是还漏了哪里 5 楼 dai_lm 2011-04-12   代码已上传,有需要的朋友可以下载
(水平有限,勿喷) 6 楼 live17909 2011-04-18   同一个工程里就包含了多套皮肤,那么切换就更简单?怎么切换呢,代码可以控制drawable不同文件夹的显示吗?drawable文件夹的图片不是系统自适应显示的吗 7 楼 dai_lm 2011-04-18   live17909 写道同一个工程里就包含了多套皮肤,那么切换就更简单?怎么切换呢,代码可以控制drawable不同文件夹的显示吗?drawable文件夹的图片不是系统自适应显示的吗

/guide/topics/resources/drawable-resource.html#LevelList
我想你可以参考这个,通过设定不同的level值,就可以调用不同的drawable,可能这个可以满足你的要求 8 楼 clm86 2011-08-11   你好,我想问一下,你还有没有研究换肤的。我看了一下你这个,这样换肤是不是要在手机上再装上新皮肤的应用。要是要换到默认的皮肤不就控制不了。。。 9 楼 dai_lm 2011-08-12   clm86 写道你好,我想问一下,你还有没有研究换肤的。我看了一下你这个,这样换肤是不是要在手机上再装上新皮肤的应用。要是要换到默认的皮肤不就控制不了。。。
这个逻辑就看各人怎么控制了,一般的做法是把皮肤的package存到数据库,然后切换。
10 楼 clm86 2011-08-14   dai_lm 写道clm86 写道你好,我想问一下,你还有没有研究换肤的。我看了一下你这个,这样换肤是不是要在手机上再装上新皮肤的应用。要是要换到默认的皮肤不就控制不了。。。
这个逻辑就看各人怎么控制了,一般的做法是把皮肤的package存到数据库,然后切换。

那不知你是怎么实现的。能否提点一下 11 楼 dai_lm 2011-08-15   clm86 写道dai_lm 写道clm86 写道你好,我想问一下,你还有没有研究换肤的。我看了一下你这个,这样换肤是不是要在手机上再装上新皮肤的应用。要是要换到默认的皮肤不就控制不了。。。
这个逻辑就看各人怎么控制了,一般的做法是把皮肤的package存到数据库,然后切换。

那不知你是怎么实现的。能否提点一下
我没有做。
如果你想做,你可以
1. 开发主程序的时候,允许其他应用调用你的数据库(用URI,网上搜一下)
2. 安装皮肤程序的时候,通过接口往你的数据库添加package名
3. 在主程序里,添加一个dialog,可以把数据库里已添加的皮肤显示出来,供切换
4. 如果切换到默认皮肤,只要把相应的变量设成某某值(例如:DEFAULT)就可以了

希望对你有所帮助 12 楼 clm86 2011-08-15   dai_lm 写道clm86 写道dai_lm 写道clm86 写道你好,我想问一下,你还有没有研究换肤的。我看了一下你这个,这样换肤是不是要在手机上再装上新皮肤的应用。要是要换到默认的皮肤不就控制不了。。。
这个逻辑就看各人怎么控制了,一般的做法是把皮肤的package存到数据库,然后切换。

那不知你是怎么实现的。能否提点一下
我没有做。
如果你想做,你可以
1. 开发主程序的时候,允许其他应用调用你的数据库(用URI,网上搜一下)
2. 安装皮肤程序的时候,通过接口往你的数据库添加package名
3. 在主程序里,添加一个dialog,可以把数据库里已添加的皮肤显示出来,供切换
4. 如果切换到默认皮肤,只要把相应的变量设成某某值(例如:DEFAULT)就可以了

希望对你有所帮助
好的,谢谢了。我试试去

热点排行