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

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
    )
}

原理说明

  1. LocalContext获取当前Locale:通过LocalContext拿到的Context已经是切换Locale后的实例,其资源会自动匹配当前语言。
  2. remember(currentLocale)缓存优化:只有当Locale发生变化时,才会重新创建FontFamily,避免不必要的性能开销。
  3. 动态绑定Typography:Typography依赖最新的FontFamily,确保主题使用的字体始终与当前Locale匹配。

额外验证点

确保你修改Locale的逻辑正确配置了App的Context,比如:

  • 更新了Configuration的locale
  • 调用了context.createConfigurationContext(newConfig)并替换了Activity的Context
    (既然你的字符串、Drawable已正常更新,这部分逻辑应该没问题)

内容的提问来源于stack exchange,提问作者Mohsen Einhesari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 13:22:25