Jetpack Compose切换Locale后字体资源未更新的解决方法
解决Compose切换Locale后字体未更新问题
问题根源
你当前的fonts和myTypography是全局静态变量,在应用启动时就已初始化,绑定的是初始Locale下的字体资源。即使调用recreate()重建Activity,全局变量不会重新初始化,因此字体仍使用旧Locale的资源,只有重启应用才会重新加载。
解决方案
将字体加载逻辑移到MyTheme Composable内部,利用当前Context的Locale动态加载资源,确保每次Locale变化时重组主题并重新加载对应字体:
修改后的MyTheme代码
@Composable fun MyTheme(content: @Composable () -> Unit) { val context = LocalContext.current // 监听Locale变化,仅当Locale改变时重新创建FontFamily val currentLocale = context.resources.configuration.locales[0] val fonts = remember(currentLocale) { FontFamily( Font(context.resources.getFont(R.font.myFont), FontWeight.Normal), Font(context.resources.getFont(R.font.myFont_bold), FontWeight.Bold), Font(context.resources.getFont(R.font.myFont_medium), FontWeight.Medium), ) } // 基于最新FontFamily创建Typography val myTypography = remember(fonts) { Typography( body1 = TextStyle( fontFamily = fonts, fontWeight = FontWeight.Normal, fontSize = 16.sp ), subtitle2 = TextStyle( fontFamily = fonts, fontWeight = FontWeight.Normal ) ) } MaterialTheme( colors = lightColorPalette, typography = myTypography, shapes = Shapes, content = content ) }
原理说明
- LocalContext获取当前Locale:通过
LocalContext拿到的Context已经是切换Locale后的实例,其资源会自动匹配当前语言。 - remember(currentLocale)缓存优化:只有当Locale发生变化时,才会重新创建
FontFamily,避免不必要的性能开销。 - 动态绑定Typography:Typography依赖最新的
FontFamily,确保主题使用的字体始终与当前Locale匹配。
额外验证点
确保你修改Locale的逻辑正确配置了App的Context,比如:
- 更新了
Configuration的locale - 调用了
context.createConfigurationContext(newConfig)并替换了Activity的Context
(既然你的字符串、Drawable已正常更新,这部分逻辑应该没问题)
内容的提问来源于stack exchange,提问作者Mohsen Einhesari
相关产品推荐
相关产品推荐

