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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 00:00:04