Android 切换语言后 Drawer 侧边栏菜单条目标题未更新问题咨询
问题原因
- 语言设置时机错误:你当前的代码是在
setContentView执行完成后才调用setDefaultLocale修改Locale,此时侧边栏菜单已经完成Inflate加载,使用的是修改前的默认Locale(英文)对应的字符串资源,后续修改Locale不会自动更新已经渲染完成的菜单文本。 - 运行时切换语言无主动刷新逻辑:如果是App运行过程中动态切换语言,系统不会主动通知已经实例化的侧边栏控件刷新文本,需要你手动触发菜单资源的重新加载。
- 系统版本适配问题:你使用的
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
相关产品推荐
相关产品推荐

