文章目录
- 在系统设置修改语言
- 创建资源目录
- 创建资源文件
- 示例
- 验证
- 代码手动切换语言
- 在Application中设置新的语言环境
- 在MainActivity / BaseActivity中设置新的语言环境
- 验证
- 问题
- 1. makeText()方法context传入是Application的context,无法获取正确的资源字符串
- 原因
- 解决方案
在系统设置修改语言
在系统设置中修改语言,app只需要通过资源文件适配即可
创建资源目录
步骤:右键res - New - Android Resource Directory
Resource type 选择 values
Available qualifiers 选择 Locale
根据自己的需求创建目录
创建资源文件
右键刚创建的资源目录 - New - Values Resource File - 输入strings
示例
values > strings.xml
<string name="module_splash_privacy_statement">隐私声明</string>
values-en > strings.xml
<string name="module_splash_privacy_statement">Privacy statement</string>
values-ru > strings.xml
<string name="module_splash_privacy_statement">Политика о конфиденциальности</string>
验证
进入手机设置页面修改语言,用代码弹出toast即可验证
MainActivity.kt
Toast.makeText(this, R.string.module_splash_privacy_statement, Toast.LENGTH_SHORT).show()
代码手动切换语言
在Application中设置新的语言环境
class ULEDApplication : Application() {
override fun onCreate() {
super.onCreate()
setLocale()
}
private fun setLocale() {
val locale = Locale("zh")
Locale.setDefault(locale)
val config = resources.configuration
config.setLocale(locale)
createConfigurationContext(config)
}
}
在MainActivity / BaseActivity中设置新的语言环境
abstract class BaseActivity : AppCompatActivity() {
override fun attachBaseContext(newBase: Context?) {
if (newBase != null) {
super.attachBaseContext(updateBaseContextLocale(newBase))
}
}
private fun updateBaseContextLocale(context: Context): Context {
val locale = Locale.getDefault()
val config = context.resources.configuration
config.setLocale(locale)
return context.createConfigurationContext(config)
}
}
验证
进入手机设置页面修改语言,用代码弹出toast即可验证
MainActivity.kt
Toast.makeText(this, R.string.module_splash_privacy_statement, Toast.LENGTH_SHORT).show()
问题
1. makeText()方法context传入是Application的context,无法获取正确的资源字符串
原因
createConfigurationContext() 并不会影响到Application的全局配置,如名字,他只是创建一个Context。
解决方案
class ULEDApplication : Application() {
/**
* 修改语言后的Context
*/
private var mNewContext: Context? = null
override fun onCreate() {
super.onCreate()
setLocale()
}
private fun setLocale() {
val locale = Locale("zh")
Locale.setDefault(locale)
val config = resources.configuration
config.setLocale(locale)
mNewContext = createConfigurationContext(config)
}
/**
* 这里用于处理手动切换多语言,获取资源字符串问题
* 如ToastUtils工具类中用到的context为Application的context,会导致无法获取正确的字符串
* 因为createConfigurationContext只能创建一个上下文,无法将上下文应用到Application中,所以用Application的Context获取的资源文件永远都是默认值
*/
override fun getResources(): Resources {
val newContext = mNewContext
return if (newContext != null) {
newContext.resources
} else {
super.getResources()
}
}
}
这样在调用 getResources() 方法时就会返回新的上下文的资源,从而实现语言的切换。