Android应用内语言切换时如何检测Locale配置变更?
检测Android应用内Locale变更的正确方式
首先明确:!newConfig.locales.isEmpty不能用来检测Locale是否变更——因为系统始终会有默认Locale,无论是否切换语言,locales都不会为空,这个判断逻辑完全无法识别Locale的变化。
正确的做法是保存当前Locale的快照,在onConfigurationChanged中与新配置的Locale对比,具体步骤如下:
- 在Activity中声明成员变量,用于保存当前Locale:
private var mCurrentLocale: Locale? = null
- 在
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 } }
- 在
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
相关产品推荐
相关产品推荐

