Kotlin应用切换App语言功能异常,跳转MainActivity后设置未生效
问题原因
你仅对SplashActivity自身的资源配置做了修改,没有同步更新应用全局的Context语言配置,新启动的MainActivity会默认读取Application层级的系统默认语言,因此跳转后就变回德语,只有重启应用后全局配置重新加载才会生效。此外你使用的config.locale方法在Android 7.0及以上版本已经废弃,也可能导致适配问题。
修复步骤
1. 修改SplashActivity的setLocale方法
同步更新全局Application的资源配置,同时适配高版本Android系统:
private fun setLocale(localeToSet: String) { createIntent(localeToSet) val locale = Locale(localeToSet) Locale.setDefault(locale) val config = resources.configuration // 适配高版本系统语言设置 config.setLocale(locale) config.setLayoutDirection(locale) // 更新当前Splash页配置 resources.updateConfiguration(config, resources.displayMetrics) // 同步更新应用全局配置 applicationContext.resources.updateConfiguration(config, applicationContext.resources.displayMetrics) PreferenceManager.getDefaultSharedPreferences(this) .edit() .putString("language", localeToSet) .apply() }
2. 自定义Application类确保启动时加载正确语言
新建自定义Application类,在应用初始化时就读取保存的偏好语言配置:
class MyApplication : Application() { override fun attachBaseContext(base: Context) { val prefs = PreferenceManager.getDefaultSharedPreferences(base) val savedLang = prefs.getString("language", "") ?: "" val targetLocale = if (savedLang.isEmpty()) { Locale.getDefault() } else { Locale(savedLang) } Locale.setDefault(targetLocale) val config = base.resources.configuration config.setLocale(targetLocale) config.setLayoutDirection(targetLocale) super.attachBaseContext(base.createConfigurationContext(config)) } }
在AndroidManifest.xml中声明该自定义Application:
<application android:name=".MyApplication" <!-- 其余原有配置保持不变 --> > <!-- Activity等组件配置 --> </application>
3. 统一Activity的语言配置(可选,推荐)
创建BaseActivity基类,让所有业务Activity继承,避免后续新增Activity出现同样的语言失效问题:
open class BaseActivity : AppCompatActivity() { override fun attachBaseContext(newBase: Context) { val prefs = PreferenceManager.getDefaultSharedPreferences(newBase) val savedLang = prefs.getString("language", "") ?: "" val targetLocale = if (savedLang.isEmpty()) { Locale.getDefault() } else { Locale(savedLang) } Locale.setDefault(targetLocale) val config = newBase.resources.configuration config.setLocale(targetLocale) config.setLayoutDirection(targetLocale) super.attachBaseContext(newBase.createConfigurationContext(config)) } }
修改SplashActivity和MainActivity的继承关系,改为继承BaseActivity即可。
内容的提问来源于stack exchange,提问作者kalinor
相关产品推荐
相关产品推荐

