我有多个应用程序,但它是一个应用程序与许多口味的许多领域。
对于每个应用程序,我都有单独的AppConfig文件包和res文件夹,其中包含每个域的图像。
路径:app/src/eu/java/in/AppConfig;app/src/com/java/in/AppConfig;app/src/fr/java/in/AppConfig等。
和单独的productFlavors为每个版本。我为每个域单独的apk。
但现在我需要做一个应用程序和应用程序本身必须在运行时更改配置和资源,然后用户更改它。
例如,用户选择域和应用程序的菜单必须采取所有应用程序正确的配置。
我如何实现这个解决方案?我如何构建一个在运行时更改其资源和配置的opp?
//config example
object AppConfig {
const val oauthToken = "url"
const val oauthClientID = "id"
....
}
//build.gradle example
productFlavors {
dev {
applicationId "dev.in.app"
dimension "default"
}
eu {
applicationId "eu.in.app"
dimension "default"
}
....
}
1条答案
按热度按时间cu6pst1q1#
总而言之,您目前有一个多风格的应用程序,需要重新构建才能更改,而您希望最终用户能够切换?
不幸的是,没有“键入此代码,它就会工作”的解决方案,您需要重新构建您的应用程序。您需要从Gradle变体切换到代码内变体切换。整体方法如下所示:
1.从多种风格的代码过渡到应用程序中的包。这将使您的所有文件/配置在单一风格中可用。例如,
/eu/java/...MyFile.kt
需要成为/java/.../eu/MyFile.kt
。1.弄清楚如何在你的变体之间转换。这非常依赖于你的情况,但一种方法是一个变体的枚举,然后存储当前活动的变体(例如,在内存中,共享首选项,房间,从服务器)。
1.在当前执行
isFeatureEnabled
等操作的任何地方,都需要确保这些检查关注当前选择的变量,而不是固定值。以你的
AppConfig
为例,你可能有/Config/
目录,其中EuConfig
,UsConfig
等定义了这些值。然后,一个ConfigManager
类让用户更改活动Config并查找所需的功能。对于资源(字符串,颜色),你有2种解决方案:1.每个变体都有自己的UI,其资源被硬编码(例如
R.string.eu_title
而不是R.string.title
)。1.每一个资源都是动态加载的,要么是通过字符串连接,要么是某种资源获取助手。这需要大量的测试。
最终这可能会花费相当多的工作,如果没有关于您的确切设置的更多信息,很难详细回答。幸运的是,当我在之前执行类似的迁移时,工作并不一定很难,只是需要一点思考和大量测试。
编辑:3年前我才意识到,这里有更多有用的提示!