在Android中编写主题应用程序

时间:2011-08-04 06:49:53

标签: android themes styles apk

我正在Android中编写应用程序,希望用户能够自己下载主题和/或创建主题。该应用程序将附带一些默认图像,任一主题可以从市场/作为其他APK安装或可以放在SD卡上 - 或者没关系。

我想要的是: - 允许主题覆盖按钮中的图像 - 现在我有XML样式来执行选择时突出显示的内容(用于按钮背景+用于将按钮bg与实际按钮图像组合) - 允许主题覆盖某些事物的背景和文本颜色(我现在不使用那里的样式,但我可以,如果这会使事情变得更容易)

我想知道是否可以根据配置覆盖我的Application / Activity的onCreate中的样式定义 - 我不介意用户在样式更改后必须重新启动应用程序。

此外,如果它是另一个APK,我的主APK将如何获得它 - 通过枚举包和按包名过滤?

是否有关于它的好教程?

1 个答案:

答案 0 :(得分:4)

这种东西在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 = new Intent("com.mydoman.action.THEME");