Android:根据用户设置以编程方式更改 SourceSet

Posted

技术标签:

【中文标题】Android:根据用户设置以编程方式更改 SourceSet【英文标题】:Android: Programmatically change SourceSet based on user settings 【发布时间】:2019-10-25 04:27:59 【问题描述】:

我正在创建一个具有管理员和用户模式的应用程序,每种模式都有自己的布局、字符串和可绘制资源文件。我想知道如何根据用户在运行时切换的应用模式更改资源SourceSet。

目前,我正在使用 2 种产品风味来执行此操作。但是风味的问题在于它是构建时间,我必须创建 2 个不同的 apk,每个风味一个。因此,能够在运行时更改 SourceSet 意味着我只能拥有 1 个 apk。

更新:我只是想要一个文本视图来调用 R.string.title,这将根据用户模式(管理员或用户)调用不同的字符串文件。这与更改 Locale 语言(例如 en vs fr)将调用适当的文件而不需要更改代码相同。

【问题讨论】:

【参考方案1】:

我想知道如何根据用户在运行时切换的应用模式更改资源SourceSet。

这是不可能的。源集是一个编译时构造。 APK 包含基于您在编译 APK 时选择的构建变体的源集的内容 - 其他源集的内容不在该 APK 中。

我正在创建一个具有管理员和用户模式的应用程序,每种模式都有自己的布局、字符串和可绘制资源文件。

那么要么是两个应用程序(和两个 APK),要么您需要将所有这些资源放在一个源集中,然后放入您的一个 APK。

通常,管理模式还涉及专用的 Java/Kotlin 代码(例如,专用的片段),因此无论如何仅交换资源是不够的。

如果您仅通过 Play 商店进行分发,您可以考虑使用动态功能模块,如果您担心包含用户和管理员代码/资源的 APK 的大小。

【讨论】:

@Davi:“我只是想要一个文本视图来调用 R.string.title,这将根据用户模式(管理员或用户)调用不同的字符串文件。” ——这是不可能的,对不起。您的应用程序中只有一个名为 R.string.title 的字符串。 项目中可能有多个,但在任何给定的 APK 中只有一个,具体取决于您的构建变体。 感谢您的回复,但我想我的问题并不清楚。我已经编辑了我的问题。 @Davi:我的comment 是对您的编辑的回应。 例如,我有2个字符串文件,values/strings.xml和values-fr/strings.xml,它们都包含R.string.title,它是根据Locale更改显示的由用户在运行时完成。这是通过调用 context.getResources().updateConfiguration() 来完成的。那么我可以根据用户选择的其他因素而不是语言(区域设置)更改来更新配置吗? @Davi:不,抱歉,除了使用两个不同的字符串(R.string.something_userR.string.something_admin)并根据您的其他因素按名称选择它们之外。【参考方案2】:

如果有公司应用程序默认启动器被锁定并且用户启动的登录屏幕默认情况下有两个独立的应用程序切换取决于用户的角色,则该解决方案对我有用。在另一个应用程序中,我只是根据用户选择的角色使用自己的逻辑启动了一个 apk 的不同屏幕。 但这也可能对您有所帮助Dynamically generating product flavors

【讨论】:

以上是关于Android:根据用户设置以编程方式更改 SourceSet的主要内容,如果未能解决你的问题,请参考以下文章

Android:以编程方式更改 NFC 设置(开/关)

以编程方式更改 android 设置“计划开机和关机”

以编程方式更改系统显示大小 Android N

以编程方式更改系统显示大小Android N

从 Android 以编程方式更改 Google Talk 在线状态

如何以编程方式在 Android Q 中打开设置面板?