首页 > 解决方案 > 更改应用程序语言无法正常工作 (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()

    }

标签: androidkotlin

解决方案


没关系,发现问题:

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,它就可以正常工作


推荐阅读