因此,我正在为API级别为25以上的Android设备进行本地化。对于某些设备(一个是像素,另一个是三星,分别安装了Android Q和P),本地化根本不起作用。
我一直在关注本文https://proandroiddev.com/change-language-programmatically-at-runtime-on-android-5e6bc15c758,甚至在尝试了此处提到的所有内容之后,都没有进行本地化设置。我的attachBaseContext被调用,上下文被设置为新属性。但是,当我将调试器放入onCreate并尝试执行此操作时。getResources()。getConfiguration()。getLocales()则仅显示设备设置中的语言环境。
通过在android API 25+中的基本活动中添加以下几行,可以生成一个最小的可重现示例:-
fun wrap(context: Context, language: String?, theme: Int): ContextThemeWrapper {
var context = context
val config = context.resources.configuration
if (language != null && language.isNotEmpty()) {
val locale = Locale(language)
Locale.setDefault(locale)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
setSystemLocale(config, locale)
} else {
setSystemLocaleLegacy(config, locale)
}
config.setLayoutDirection(locale)
context = context.createConfigurationContext(config)
}
return ContextThemeWrapper(context, theme)
}
@SuppressWarnings("deprecation")
fun setSystemLocaleLegacy(config: Configuration, locale: Locale) {
config.locale = locale
}
@TargetApi(Build.VERSION_CODES.N)
fun setSystemLocale(config: Configuration, locale: Locale) {
config.setLocale(locale)
}
@Override
public void attachBaseContext(Context newBase){
super.attachBaseContext(wrap(newBase,"tr",R.style.AppTheme));
}