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

Android应用内语言切换时如何检测Locale配置变更?

检测Android应用内Locale变更的正确方式

首先明确:!newConfig.locales.isEmpty不能用来检测Locale是否变更——因为系统始终会有默认Locale,无论是否切换语言,locales都不会为空,这个判断逻辑完全无法识别Locale的变化。

正确的做法是保存当前Locale的快照,在onConfigurationChanged中与新配置的Locale对比,具体步骤如下:

  1. 在Activity中声明成员变量,用于保存当前Locale:
private var mCurrentLocale: Locale? = null
  1. 在onCreate方法中初始化这个变量,适配不同Android版本:
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    
    mCurrentLocale = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        resources.configuration.locales[0]
    } else {
        @Suppress("DEPRECATION")
        resources.configuration.locale
    }
}
  1. 在onConfigurationChanged中对比新旧Locale,判断是否发生变更:
@RequiresApi(Build.VERSION_CODES.N)
override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig)

    // 保留你已有的文字方向检测逻辑
    if (newConfig.layoutDirection == Configuration.SCREENLAYOUT_LAYOUTDIR_LTR) {
        finishAffinity()
        recreate()
    }

    // 获取新配置中的Locale
    val newLocale = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        newConfig.locales[0]
    } else {
        @Suppress("DEPRECATION")
        newConfig.locale
    }

    // 对比新旧Locale,判断是否变更
    if (mCurrentLocale != newLocale) {
        // 执行Locale变更后的逻辑,比如重启Activity更新UI
        mCurrentLocale = newLocale
        finishAffinity()
        recreate()
    }
}

补充说明

  • Android N(API 24)及以上版本使用config.locales[0]获取当前Locale,旧版本使用已废弃的config.locale,代码中需要添加版本适配和废弃注解。
  • Locale类已经重写了equals方法,直接使用!=对比即可准确判断语言、国家/地区是否发生变化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 10:18:23