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

Android 切换语言后 Drawer 侧边栏菜单条目标题未更新问题咨询

问题原因
  1. 语言设置时机错误:你当前的代码是在setContentView执行完成后才调用setDefaultLocale修改Locale,此时侧边栏菜单已经完成Inflate加载,使用的是修改前的默认Locale(英文)对应的字符串资源,后续修改Locale不会自动更新已经渲染完成的菜单文本。
  2. 运行时切换语言无主动刷新逻辑:如果是App运行过程中动态切换语言,系统不会主动通知已经实例化的侧边栏控件刷新文本,需要你手动触发菜单资源的重新加载。
  3. 系统版本适配问题:你使用的resources.updateConfiguration方法在Android 7.0及以上版本已被废弃,高版本系统下可能出现Locale设置不生效的问题。
解决方案

1. 调整Locale设置时机

将setDefaultLocale调用移到super.onCreate和setContentView之前,保证页面所有控件初始化时使用的就是目标Locale的资源:

override fun onCreate(savedInstanceState: Bundle?) {
    setDefaultLocale("ro") // 移到最顶部执行
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main_activity)
    // 剩余原有逻辑
}

2. 动态切换语言后手动刷新侧边栏

如果是运行时用户主动切换语言,修改Locale后可以任选以下一种方案刷新侧边栏:

  • 简单方案:调用Activity的recreate()方法重建页面,所有控件会自动重新加载新Locale对应的资源,无需额外修改代码。
  • 手动刷新菜单方案:拿到侧边栏NavigationView实例,清空原有菜单后重新加载菜单资源:
// 切换语言后执行
val navView = findViewById<NavigationView>(R.id.你的侧边栏控件ID)
navView.menu.clear()
navView.inflateMenu(R.menu.你的侧边栏菜单资源ID)
// 原有菜单点击监听如果是全局设置的不需要重新绑定

3. 适配高版本系统Locale设置

废弃updateConfiguration方法,重写Activity的attachBaseContext方法设置Locale,适配Android 7.0及以上系统:

override fun attachBaseContext(newBase: Context?) {
    // 可以从SharedPreferences读取用户保存的语言设置,示例固定为罗马尼亚语
    val targetLang = "ro"
    val locale = Locale(targetLang)
    val config = Configuration(newBase?.resources?.configuration)
    config.setLocale(locale)
    config.setLayoutDirection(locale)
    val localeContext = newBase?.createConfigurationContext(config)
    super.attachBaseContext(localeContext)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:30:00