Android应用内动态切换语言失效求助(7.0 Nougat)
应用内动态切换语言的可行方案(适配Android 7.0+)
当然可以在应用内动态切换语言,完全不用用户跑去改系统设置!你在Android 7.0真机上遇到的问题,其实是因为从Android N(也就是7.0版本)开始,系统对应用语言的管理逻辑变了,旧的切换方法在新版本系统上不生效了。下面给你详细讲讲怎么解决:
核心原因
在Android 7.0之前,我们只需要修改Configuration里的locale,再调用resources.updateConfiguration()就能切换语言。但从Android N开始,系统引入了LocaleList来管理应用的语言优先级,单纯修改Configuration会被系统覆盖,必须通过创建新的上下文来加载对应语言的资源。
具体实现步骤
1. 写一个语言切换工具类
先封装一个工具类,用来处理语言切换的核心逻辑,还能把用户选择的语言保存起来:
object LanguageSwitcher { fun applySelectedLanguage(context: Context, languageCode: String) { val targetLocale = Locale(languageCode) Locale.setDefault(targetLocale) val resources = context.resources val config = resources.configuration config.setLocale(targetLocale) config.setLayoutDirection(targetLocale) // 适配Android 7.0+的关键代码 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { context.createConfigurationContext(config) } else { resources.updateConfiguration(config, resources.displayMetrics) } // 把选择的语言存在SharedPreferences里,下次启动应用自动加载 val sp = context.getSharedPreferences("app_lang_settings", Context.MODE_PRIVATE) sp.edit().putString("selected_lang", languageCode).apply() } }
2. 在Application中初始化语言设置
每次应用启动时,读取之前保存的语言设置,重新配置上下文,确保一打开应用就是用户想要的语言:
class MyApp : Application() { override fun attachBaseContext(base: Context) { // 读取保存的语言,默认用英语 val sp = base.getSharedPreferences("app_lang_settings", Context.MODE_PRIVATE) val savedLang = sp.getString("selected_lang", "en") ?: "en" // 更新BaseContext的语言配置 val updatedContext = updateContextLocale(base, savedLang) super.attachBaseContext(updatedContext) } private fun updateContextLocale(context: Context, langCode: String): Context { val targetLocale = Locale(langCode) Locale.setDefault(targetLocale) val config = context.resources.configuration config.setLocale(targetLocale) config.setLayoutDirection(targetLocale) return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { context.createConfigurationContext(config) } else { context.resources.updateConfiguration(config, context.resources.displayMetrics) context } } }
别忘了在AndroidManifest.xml里把Application指定为你自定义的这个类哦~
3. 切换语言后重启页面
当用户在应用内的设置页面选择了语言(比如印地语hi、卡纳达语kn),调用工具类的方法后,需要重启当前Activity或者整个应用,让新的语言配置生效:
// 举个例子,设置页面的按钮点击事件 btnSwitchToHindi.setOnClickListener { LanguageSwitcher.applySelectedLanguage(this, "hi") // 重启当前Activity finish() startActivity(intent) // 如果是多页面应用,建议重启整个应用,比如启动闪屏页 // val intent = Intent(this, SplashActivity::class.java) // intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK // startActivity(intent) }
4. 额外注意点
- 所有Activity最好都使用Application的上下文加载资源,避免出现部分页面语言不更新的情况。
- 对于Android 12及以上版本,可以在Activity的Manifest标签里加上
android:configChanges="locale|layoutDirection",减少系统自动重启页面的情况。 - 部分定制ROM(比如小米、华为)可能有语言缓存,切换后可能需要多重启一次应用才能生效,这是厂商系统的问题,属于个别情况。
这样操作之后,用户就能在应用内直接切换语言,不用去系统设置里折腾啦!
内容的提问来源于stack exchange,提问作者Darshan Adakane
相关产品推荐
相关产品推荐

