Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
216 views
in Technique[技术] by (71.8m points)

android - Kotlin - How to change the locale

I was trying the below piece of code to change the app language using Kotlin but this code is not working. Can anyone please suggest where I am doing wrong?

BaseFragment.kt

open fun setLocale(lang: String, redirectActivity: Boolean, activity: Activity?){
    if(activity != null) {
        val configuration = resources.configuration
        val locale = Locale(lang)
        configuration.setLocale(locale)
        configuration.setLayoutDirection(locale)
        activity.createConfigurationContext(configuration)

        val sharedPref: SharedPreferences =
        activity.getSharedPreferences(getString(R.string.app_name), 0)
        val editor = sharedPref.edit()
        editor.putString("lang", lang)
        editor.apply()

        activity.finish()
        startActivity(activity.intent.putExtra("redirectActivity", redirectActivity))
    }
}

LanguageFragment.kt

BaseFragment.setLocale(newLang, true, activity)

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

The default Locale needs to be set & then resources need to be updated for recreating the view. Additionally, for build version lower than Android N, you need to update the configuration of the resources too, like the following:

val locale = Locale(language)
Locale.setDefault(locale)

val resources = context.resources

val configuration = resources.configuration
configuration.locale = locale
configuration.setLayoutDirection(locale)

resources.updateConfiguration(configuration, resources.displayMetrics)

Here's a demo working version with one button to save the language in shared preference (as the given code snippet does) and recreate with the updated Local. Feel free to use the LocaleHelper utility class and call it like showed in its MainActivity, if it helps:

LocaleHelper().setLocale(this@MainActivity, "en")
recreate()

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...