Tob*_*ich 8 android android-appcompat android-resources android-night-mode
这是一种难以描述的效果。
我们的 Android 应用程序支持两种语言,但是我们不使用系统语言而是让用户在设置中进行设置。然后,在附加应用程序的 BaseContext 之前,我们设置语言环境配置。
// in Application class
override fun attachBaseContext(base: Context) {
super.attachBaseContext(LocaleHelper.onAttach(base))
}
// the LocaleHelper
fun onAttach(context: Context): Context {
return setLocale(context, getPersistedLanguage(context), getPersistedCountry(context))
}
Run Code Online (Sandbox Code Playgroud)
这样,attachBaseContext 调用就会获得一个上下文,该上下文的语言环境设置为例如“de”而不是“en”——即使设备是英文的。
到目前为止,这很有效,并且根据设置,来自上下文的所有资源都使用该语言。但是,我们现在为夜间模式添加了另一个设置(即让用户可以选择在“正常”或“黑暗模式”中设置“主题”)。
出于这个原因,我们的想法是设置这样的东西
if (enableDarkMode) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
} else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
}
Run Code Online (Sandbox Code Playgroud)
在应用程序的 onCreate() 中(我们也在 Activity 中尝试过)。
但是,这样做时,突然间资源(至少一些)加载了设备区域设置。菜单条目采用设备语言。但是,检查 Locale.getLanguage() 给了我配置的语言和动态调用的字符串(例如 context.getString(R.string.xyz))也以正确配置的语言显示。
这导致假设菜单资源有些(重新)加载(再次)但不尊重来自 JVM 的设置区域设置。
有谁知道如何找到那个错误?我们在这里缺少什么?菜单资源的加载方式不同吗?
我刚刚发现了一个 hacky 解决方案,但如果有人遇到同样的问题,这可能会有所帮助:
我添加到清单中的活动
android:configChanges="uiMode"
Run Code Online (Sandbox Code Playgroud)
告诉应用程序“自己处理 ui 模式更改”。在这种情况下,资源保持“不变”,但我不确定此更改可能会产生什么其他影响。
因此,如果您对让系统/应用程序自行处理夜间模式更改时出现的问题有任何进一步的提示,请告诉我。
| 归档时间: |
|
| 查看次数: |
689 次 |
| 最近记录: |