android - 更改应用程序语言无法正常工作 (Kotlin)
问题描述
我的 kotlin 应用程序中有一个启动画面,我可以在其中执行一些操作,例如加载数据。目前它只有德语,我想添加英语作为附加语言。我已经创建了字符串资源等等。现在我在 Splash-Screen 中添加了一些代码,它会检查用户是否已经设置了偏好语言(保存在 sharedPreferences 中)。
当没有保存任何内容时,会弹出一个简单的警报对话框,询问用户的偏好并相应地设置所有内容。然后重新加载启动画面。当我在我的设备上选择英语(系统语言为德语)时,初始屏幕会获取正确的字符串资源(英语)。
但是当它更改为 MainActivity 时,它又是德语了。只有在重新启动应用程序后,一切都是英文的。
以下是我在启动画面上更改语言的方法:
private lateinit var mainIntent : Intent
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val prefs: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
var localeToSet: String? = prefs.getString("language", "")
if(localeToSet == null || localeToSet.equals("")){
val languages = arrayOf("Deutsch", "English")
val langSelectorBuilder = AlertDialog.Builder(this)
langSelectorBuilder.setTitle(R.string.selectLanguageText)
langSelectorBuilder.setCancelable(false)
langSelectorBuilder.setSingleChoiceItems(languages, -1) { dialog, selection ->
when(selection) {
0 -> {
localeToSet = "de"
setLocale("de")
}
1 -> {
localeToSet = "en"
setLocale("en")
}
}
recreate()
dialog.dismiss()
}.setOnDismissListener {
Handler().postDelayed({
startActivity(mainIntent)
finish()
}, SPLASH_TIME_OUT)
}
langSelectorBuilder.create().show()
}
else{
setLocale(localeToSet!!)
Handler().postDelayed({
startActivity(mainIntent)
finish()
}, SPLASH_TIME_OUT)
}
setContentView(R.layout.activity_splash_screen)
}
private fun createIntent(localeToSet: String){
mainIntent = Intent(this@SplashScreenActivity, MainActivity::class.java).apply {
//Do stuff and pass data to mainactivity
}
private fun setLocale(localeToSet: String) {
createIntent(localeToSet)
val config = resources.configuration
val locale = Locale(localeToSet)
Locale.setDefault(locale)
config.locale = locale
resources.updateConfiguration(config, resources.displayMetrics)
val prefs: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
val editor: SharedPreferences.Editor = prefs.edit()
editor.putString("language", localeToSet)
editor.apply()
}
解决方案
没关系,发现问题:
val langSelectorBuilder = AlertDialog.Builder(this)
langSelectorBuilder.setTitle(R.string.selectLanguageText)
langSelectorBuilder.setCancelable(false)
langSelectorBuilder.setSingleChoiceItems(languages, -1) { dialog, selection ->
when(selection) {
0 -> {
localeToSet = "de"
setLocale("de")
}
1 -> {
localeToSet = "en"
setLocale("en")
}
}
recreate()
dialog.dismiss()
}.setOnDismissListener {
finish()
}
langSelectorBuilder.create().show()
无需在此处启动 MainActivity,它就可以正常工作
推荐阅读
- r - 每次出现在一组观察值中时,我如何要求 R 标记特定模式(即列值从 1 变为 0)?
- node.js - VS Code 在执行 yarn install 时无法读取 Node Modules 文件(在执行 npm install 时可以读取)
- opencv - 如何过滤更大的文本字体?
- flutter - Flutter中的ShowDialog总是全屏?
- coq - Coq 中内置函数的使用
- java - Kubernates/Spring boot 如何监控 JVM 崩溃
- angular - 如何添加 MatButtonModule Angular
- python - 为什么我在 python 中得到这个组错误?
- php - 如果满足 php 条件,如何使用 PDO 准备语句
- mongodb - 如何在 F# 中使用字符串动态指定字段 MongoDB 定义