android - 在 Android 中编写主题应用程序

标签 android themes styles apk

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

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

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

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

有没有好的教程?

最佳答案

这种东西在 Android 中并没有作为标准设施得到真正的支持,因此您需要做大量的工作来自己构建它。

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

要发现可用的 .apk(以及与 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 intent = new Intent("com.mydoman.action.THEME");

关于android - 在 Android 中编写主题应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6937279/

相关文章:

java - OpenGL ES 2.0 - 如何有效地将纹理复制到帧缓冲区中

android - 从 strings.xml 获取数据

syntax-error - Visual Studio Code 主题 - 更改 CSS 语法错误字体颜色

android - 样式下拉/导航栏 actionbarsherlock 字体

arrays - 在 react 中将类添加到数组的一个元素

android - LayoutManager for RecyclerView 根据项目的宽度自动设置列数

android - Nexus one 未显示在 DDMS 问题中

php - 从单个帖子获取 Wordpress 类别

html - 自定义 HTML 正文的大小

wpf - 通过 setter v ContentTemplate 设置内容样式