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

Android 13/14应用语言切换异常问题求助

解决Android 13+版本应用语言切换失效问题

你的代码在Android 13以下版本正常,但在13/14版本出现部分生效或完全无响应的情况,核心原因是Android 13(API 33)开始对Locale管理逻辑做了重大调整:系统不再优先识别单个Locale设置,而是改用Locale列表来管理语言优先级;同时updateConfiguration方法已被废弃,高版本系统会忽略该方法的修改。

修复后的核心代码

针对不同API版本做兼容处理,改用官方推荐的setLocales(13+)和createConfigurationContext方法:

import android.content.Context
import android.content.res.Configuration
import android.os.Build
import java.util.Locale

fun updateAppLocale(context: Context, targetLocale: Locale): Context {
    val resources = context.resources
    val newConfig = Configuration(resources.configuration)

    when {
        Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU -> {
            // Android 13+ 必须使用 LocaleList 设置语言
            val localeList = LocaleList(targetLocale)
            newConfig.setLocales(localeList)
        }
        else -> {
            @Suppress("DEPRECATION")
            newConfig.setLocale(targetLocale)
        }
    }
    // 同步设置布局方向
    newConfig.setLayoutDirection(targetLocale)

    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        // Android 7.0+ 推荐创建新配置上下文,避免修改全局资源
        context.createConfigurationContext(newConfig)
    } else {
        @Suppress("DEPRECATION")
        resources.updateConfiguration(newConfig, resources.displayMetrics)
        context
    }
}

关键注意事项

  • 上下文替换:切换语言后,必须使用返回的新Context启动所有后续组件(Activity、Fragment、Service等),否则旧上下文的配置不会更新。
  • 重启生效:切换完成后,建议重启当前Activity或整个应用,确保所有页面都加载新语言资源:
    // 示例:切换语言后重启Activity
    val updatedContext = updateAppLocale(this, targetLocale)
    val intent = intent
    finish()
    startActivity(intent, updatedContext.newActivityOptions(null).toBundle())
    
  • 避免依赖Locale.setDefault:高版本系统会优先使用Configuration中的LocaleList,手动设置的默认Locale可能被覆盖,无需依赖该方法。
  • 全局上下文维护:在Application类中保存更新后的Context,确保所有组件都使用统一的配置上下文。

原代码失效原因

  1. Android 13+ 系统会忽略setLocale的单语言设置,强制使用LocaleList管理语言优先级;
  2. updateConfiguration在高版本已被标记为废弃,系统不再处理该方法对全局资源的修改;
  3. 仅返回createConfigurationContext的结果,但未替换组件使用的上下文,导致部分页面仍用旧配置加载资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 12:22:25