我正在用Android编写应用程序,希望用户能够下载主题和/或自己创建主题。该应用程序将带有一些默认图像,并且可以从Market/其他APK中安装主题,也可以将其放在sdcard上-都可以。
我想要的是:
-允许主题覆盖按钮中的图像-现在,我具有XML样式来进行诸如选中时突出显示的操作(用于按钮背景+用于将按钮bg与实际按钮图像结合在一起)
-允许主题覆盖某些事物的背景和文本颜色(我暂时不使用样式,但是如果可以的话,可以使事情变得更容易)
我想知道是否有可能仅基于配置在我的Application/Activity的onCreate中覆盖样式定义-我不介意用户在样式更改后不必重新启动应用程序。
另外,如果它将是另一个APK,我的主APK将如何获得它-通过枚举包并按包名称进行过滤?
也许有一个很好的教程吗?
最佳答案
这种事情实际上并没有在Android中作为标准工具得到支持,因此您要自己进行大量工作。
您需要了解的第一件事是Context.createPackageContext(),它使您可以为另一个.apk创建一个Context(从而加载其资源)。然后,您可以使用该Context加载图像等。请注意,这些资源与您自己的应用程序资源完全不同,因此您不能使用主题等标准工具进行替换。您只需要在需要加载“主题”资源的任何地方手动放置代码,即可从此Context中显式检索代码。
要发现可用的.apks(以及要与createPackageContext()一起使用的软件包名称),可以使用PackageManager工具对组件进行查询。例如,您可以说每个主题.apk都具有这样的含义:
<receiver android:name="something">
<intent-filter>
<action android:name="com.mydoman.action.THEME" />
</intent-filter>
</receiver>
现在,您可以通过PackageManager.queryBroadcastReceivers()找到具有此类接收器的所有.apks:
http://developer.android.com/reference/android/content/pm/PackageManager.html#queryBroadcastReceivers(android.content.Intent, int)
要选择具有以上 Intent 过滤器的过滤器,请使用通过以下方式制成的 Intent
Intent intent = new Intent("com.mydoman.action.THEME");