如何让Android应用强制跟随手机系统语言?
Android应用“自动跟随系统语言”功能修复方案
问题根源
手动切换语言后,Locale.getDefault()会被替换为应用当前使用的语言,而非系统原生语言。因此选择“自动”选项时,获取到的是应用之前设置的语言,而非手机系统的真实语言。
修复步骤
1. 修改语言保存逻辑
将“自动”选项的保存值改为标记字符串(而非具体语言代码),避免混淆系统语言与应用当前语言。
修改Settings.kt中保存语言的代码:
// 原代码 else if(auLa.isChecked){ codeLang = Locale.getDefault().toString() } // 修改后 else if(auLa.isChecked){ codeLang = "auto" // 存储标记,而非具体语言代码 }
2. 在应用启动时动态设置语言
在BaseActivity的onCreate方法中,根据保存的标记判断是否使用系统语言,确保每次启动应用时都能正确获取系统原生Locale:
import android.os.Build import android.content.res.Resources import java.util.Locale override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val preferences = PreferenceManager.getDefaultSharedPreferences(this) val selectedLanguage = preferences.getString("language", "en") val targetLocale = if (selectedLanguage == "auto") { // 获取系统原生语言,不受应用自身设置影响 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { Resources.getSystem().configuration.locales.get(0) } else { Resources.getSystem().configuration.locale } } else { Locale(selectedLanguage) } // 应用语言设置 Locale.setDefault(targetLocale) val configuration = Configuration() configuration.locale = targetLocale resources.updateConfiguration(configuration, resources.displayMetrics) }
3. 适配Android 12+(可选)
针对API 31及以上版本,updateConfiguration已被废弃,可改用createConfigurationContext实现:
val config = resources.configuration config.setLocale(targetLocale) createConfigurationContext(config)
关键说明
- 使用
Resources.getSystem()能直接获取系统级别的配置,避免应用自身Locale设置干扰 - 保存“auto”标记而非具体语言代码,让应用每次启动时都能重新读取系统语言状态
内容的提问来源于stack exchange,提问作者Hadj Said Aoumer
相关产品推荐
相关产品推荐

