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

如何通过SharedPreference修改应用语言?Preference Fragment访问ListPreference遇阻

解决通过Preference Fragment修改应用语言的问题

我来帮你搞定这个语言切换的问题,咱们一步步来:

第一步:确认ListPreference的XML配置

首先得确保你的preferences.xml里的ListPreference配置正确,要给它设置对应键、标题、选项值和显示文本:

<ListPreference
    android:key="app_language"
    android:title="@string/language_setting"
    android:summary="%s"
    android:entries="@array/language_display_names"
    android:entryValues="@array/language_codes"
    android:defaultValue="en"/>

对应的strings.xml里要添加语言选项数组:

<string-array name="language_display_names">
    <item>English</item>
    <item>中文</item>
    <item>Español</item>
</string-array>
<string-array name="language_codes">
    <item>en</item>
    <item>zh</item>
    <item>es</item>
</string-array>

第二步:在Preference Fragment中获取ListPreference并设置监听

如果你用的是AndroidX的Preference库,不用手动绑定到onCreate,直接在onCreatePreferences里初始化并设置监听即可:

class SettingsFragment : PreferenceFragmentCompat() {
    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource(R.xml.preferences, rootKey)
        
        // 获取ListPreference实例
        val languagePref = findPreference<ListPreference>("app_language")
        
        // 初始化显示当前选中的语言作为摘要
        languagePref?.summary = languagePref?.entry
        
        // 设置偏好变更监听
        languagePref?.setOnPreferenceChangeListener { _, newValue ->
            val selectedLang = newValue as String
            // 执行语言切换逻辑
            updateAppLanguage(selectedLang)
            // 更新摘要为选中的语言名称
            languagePref.summary = languagePref.entries[languagePref.findIndexOfValue(selectedLang)]
            true
        }
    }
    
    private fun updateAppLanguage(langCode: String) {
        // 把选中的语言保存到SharedPreferences
        PreferenceManager.getDefaultSharedPreferences(requireContext())
            .edit()
            .putString("app_language", langCode)
            .apply()
        
        // 更新应用Locale
        val locale = Locale(langCode)
        Locale.setDefault(locale)
        val config = resources.configuration
        config.setLocale(locale)
        resources.updateConfiguration(config, resources.displayMetrics)
        
        // 重启当前Activity让语言生效
        requireActivity().finish()
        startActivity(requireActivity().intent)
    }
}

第三步:应用启动时加载保存的语言设置

别忘了在主Activity的onCreate方法里,在setContentView之前加载保存的语言设置,这样每次启动应用都会用用户选择的语言:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        // 先加载保存的语言设置
        loadSavedLanguage()
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
    
    private fun loadSavedLanguage() {
        val sharedPref = PreferenceManager.getDefaultSharedPreferences(this)
        val langCode = sharedPref.getString("app_language", "en") ?: "en"
        
        val locale = Locale(langCode)
        Locale.setDefault(locale)
        val config = resources.configuration
        config.setLocale(locale)
        resources.updateConfiguration(config, resources.displayMetrics)
    }
}

小提醒

  • 如果你用的是Android 12及以上,updateConfiguration已被废弃,建议用createConfigurationContext创建新上下文,但上面的代码在低版本依然兼容。
  • 重启Activity时,要注意保持页面状态(比如用ViewModel存储临时数据),避免用户体验受影响。

内容的提问来源于stack exchange,提问作者Leul Mekonnen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:34:27