You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 04:36:04