在Android中编写主题应用程序

在Android中编写主题应用程序,android,themes,styles,apk,Android,Themes,Styles,Apk,我正在用Android编写一个应用程序,希望用户能够下载主题和/或自己创建主题。该应用程序将附带一些默认图像,主题可以从Market/作为其他APK安装,也可以放在SD卡上,两者都可以 我想要的是: -允许主题覆盖按钮中的图像-现在我有XML样式来做一些事情,比如选中时高亮显示(对于按钮背景+用于将按钮bg与实际按钮图像相结合) -允许主题覆盖某些内容的背景和文本颜色(我现在不使用样式,但如果这能让事情变得更简单的话,我可以) 我想知道是否可以根据配置覆盖我的应用程序/活动的onCreate中的

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

我想要的是: -允许主题覆盖按钮中的图像-现在我有XML样式来做一些事情,比如选中时高亮显示(对于按钮背景+用于将按钮bg与实际按钮图像相结合) -允许主题覆盖某些内容的背景和文本颜色(我现在不使用样式,但如果这能让事情变得更简单的话,我可以)

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

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


也许有一个关于它的好教程吗?

这种东西在Android中并没有作为标准工具得到真正的支持,所以你正朝着自己构建它的方向努力

您需要了解的第一件事是Context.createPackageContext(),它允许您为另一个.apk创建上下文(从而加载其资源)。然后可以使用该上下文加载图像等。请注意,这些资源与您自己的应用程序资源完全不同,因此您不能使用主题之类的标准工具来进行替换。您只需要手动将代码放在您想要加载“主题化”资源的任何地方,该资源将显式地从该上下文检索代码

要发现可用的.apk(以及与createPackageContext()一起使用的包名称),可以使用PackageManager工具查询组件。例如,您可以说每个theme.apk都有一个如下的主题:

<receiver android:name="something">
    <intent-filter>
        <action android:name="com.mydoman.action.THEME" />
    </intent-filter>
</receiver>
Intent intent = new Intent("com.mydoman.action.THEME");