该应用程序支持os 8.0 +
我添加了values-ar
文件夹,它支持strings.xml
。如果我将语言从手机设置更改为阿拉伯语,则该应用会加载正确的资源。
如果我在运行时在Application
类中设置了默认语言环境,它将无法加载特定的(“ ar”)资源。
这是我更改conf(在Application
类上)的方式:
fun changeDefaultLocale() {
Locale.setDefault(Locale("ar")
val configuration = resources.configuration
configuration.setLocale(locale)
this.createConfigurationContext(configuration)
}
我尝试过的事情:
values-ar
重命名为values-ar-rEG
resConfigs "en", "ar"
上添加app/build.gradle
android:configChanges="locale"
添加到Manifest/<application
Locale("ar","AE")
或Locale("ar","EG")
我在调用上面的changeDefaultLocale()
有趣之后在行上设置了一个断点:
为什么它没有加载正确的资源文件?我重复一遍,如果我从手机设置中更改了它,它将正常工作。
更新
使用@Nurbol响应,我如下更新了BaseActivity
,它工作正常。我现在的问题是:
Activity A
-> Activity B (here I switch the locale)
,然后按回车,系统将恢复Activity A
,它具有旧的配置和旧的语言环境。如何克服呢?
override fun attachBaseContext(base: Context) {
super.attachBaseContext(updateBaseContextLocale(base))
}
private fun updateBaseContextLocale(context: Context): Context {
val locale = Locale("ar")
Locale.setDefault(locale)
return updateResourcesLocale(context, locale)
}
@TargetApi(Build.VERSION_CODES.N)
private fun updateResourcesLocale(context: Context, locale: Locale): Context {
val configuration = context.resources.configuration
configuration.setLocale(locale)
return context.createConfigurationContext(configuration)
}
答案 0 :(得分:0)
更改语言环境。原因是越野车。如果您真的要更改它。您应该在changeDefaultLocale()
之前的每个活动的onCreate()
中调用setContentView()
方法。您可以简单地创建 BaseActivity 类,并将其用作每个活动的父类。
abstract class BaseActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Change locale settings in the app.
val dm = resources.displayMetrics
val conf = resources.configuration
val lang = "ar"
conf.setLocale(Locale(lang.toLowerCase())) // API 17+ only.
resources.updateConfiguration(conf, dm)
}
}