Kotlin安卓如何实现关闭重启应用后保留Spinner语言选择项?
安卓Kotlin实现多语言选择持久化方案
核心实现逻辑是通过SharedPreferences本地存储用户选中的语言编码,应用启动时自动读取存储值应用语言配置,进入语言设置页时自动回显Spinner的选中状态即可,具体修改步骤如下:
步骤1:新增SharedPreferences读写方法
在Languages_Activity中新增本地存储的读写逻辑,用于持久化保存用户的语言选择:
// 定义SharedPreferences存储常量 private val SP_NAME = "app_config" private val KEY_SELECTED_LANG = "selected_language" // 读取本地存储的语言,默认返回英文en private fun getSavedLanguage(): String { val sp = getSharedPreferences(SP_NAME, MODE_PRIVATE) return sp.getString(KEY_SELECTED_LANG, "en") ?: "en" } // 保存用户选择的语言到本地 private fun saveLanguage(langCode: String) { val sp = getSharedPreferences(SP_NAME, MODE_PRIVATE) sp.edit().putString(KEY_SELECTED_LANG, langCode).apply() }
步骤2:修改setLocale方法,选中语言时持久化存储
修改原有的setLocale方法,用户切换语言时先把选择的语言编码存入本地:
private fun setLocale(localeName: String) { if (localeName != currentLanguage) { // 新增:保存语言选择到本地 saveLanguage(localeName) locale = Locale(localeName) val res = resources val dm = res.displayMetrics val conf = res.configuration conf.locale = locale res.updateConfiguration(conf, dm) val refresh = Intent( this, Languages_Activity::class.java ) refresh.putExtra(currentLang, localeName) startActivity(refresh) } else { Toast.makeText( this@Languages_Activity, "该语言已被选中", Toast.LENGTH_SHORT).show(); } }
步骤3:修改onCreate逻辑,回显Spinner选中状态
初始化页面时优先读取本地存储的语言,同时根据存储值自动选中Spinner对应选项:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_languages_) title = "KotlinApp" // 修改:初始化时读取本地存储的语言,而非仅从Intent取值 currentLanguage = getSavedLanguage() spinner = findViewById(R.id.spinner) val list = ArrayList<String>() list.add("Select Language") list.add("English") list.add("Malay") val adapter = ArrayAdapter(this, R.layout.support_simple_spinner_dropdown_item, list) adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) spinner.adapter = adapter // 新增:回显Spinner选中状态 when(currentLanguage) { "en" -> spinner.setSelection(1) "my" -> spinner.setSelection(2) else -> spinner.setSelection(0) } spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) { when (position) { 0 -> {} 1 -> setLocale("en") 2 -> setLocale("my") } } override fun onNothingSelected(parent: AdapterView<*>) {} } back_btn = findViewById(R.id.back_btn_language) back_btn?.setOnClickListener { val intent = Intent(this, MainActivity::class.java) startActivity(intent) } }
步骤4:全局语言自动生效(可选推荐)
如果需要应用启动时不需要进入语言页也能自动应用保存的语言,可自定义Application类全局初始化语言配置:
class MyApp : Application() { override fun onCreate() { super.onCreate() val sp = getSharedPreferences("app_config", MODE_PRIVATE) val lang = sp.getString("selected_language", "en") ?: "en" val locale = Locale(lang) Locale.setDefault(locale) val res = resources val config = res.configuration config.setLocale(locale) res.updateConfiguration(config, res.displayMetrics) } }
修改完成后需要在AndroidManifest.xml的application标签中添加属性android:name=".MyApp"注册自定义Application即可。
内容的提问来源于stack exchange,提问作者Enigma
相关产品推荐
相关产品推荐

