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

Jetpack Compose中fontWeight属性对中文不生效的解决方案

问题根因

Compose的Text组件默认调用系统内置无衬线字体,该字体对中文字符的字重支持存在版本差异:Android 12以下的系统默认中文字体仅内置FontWeight.Normal(400)、FontWeight.Bold(700)两个字重档位,当你设置100、300、500、900等其他字重时,中文字符找不到对应字重的字形资源,会自动回退到常规400字重显示;而英文字符的字重覆盖完整,所以设置的字重可以正常生效。

可行解决方案
  • 引入支持全字重的自定义中文字体(兼容性最优,推荐)
    将覆盖全字重档位的开源中文字体(如思源黑体、阿里巴巴普惠体等)放入项目res/font目录,通过FontFamily绑定每个字重对应的字体文件,使用时给Text指定该字体族即可,所有Android版本都能稳定显示对应字重。
    示例代码:
    // 先在res/font目录下放置对应字重的字体文件,命名示例:
    // notosans_sc_thin.ttf -> 对应100字重
    // notosans_sc_light.ttf -> 对应300字重
    // notosans_sc_regular.ttf -> 对应400字重
    // notosans_sc_medium.ttf -> 对应500字重
    // notosans_sc_bold.ttf -> 对应700字重
    // notosans_sc_black.ttf -> 对应900字重
    val NotoSansSC = FontFamily(
        Font(R.font.notosans_sc_thin, FontWeight.Thin),
        Font(R.font.notosans_sc_light, FontWeight.Light),
        Font(R.font.notosans_sc_regular, FontWeight.Normal),
        Font(R.font.notosans_sc_medium, FontWeight.Medium),
        Font(R.font.notosans_sc_bold, FontWeight.Bold),
        Font(R.font.notosans_sc_black, FontWeight.Black)
    )
    
    // 实际调用
    Text(
        text = "你好",
        fontWeight = FontWeight(100),
        fontFamily = NotoSansSC
    )
    
  • 版本适配方案
    Android 12(API 31)及以上版本的系统默认可变字体已经补齐了全档位中文字重支持,如果你的应用minSdk >= 31,可以直接设置fontWeight无需额外处理;如果需要兼容低版本,可做版本判断:高版本直接用系统字体,低版本加载上述自定义字体即可。
  • 临时粗体场景替代
    如果你只需要粗体显示效果,不需要细体、中粗等其他字重档位,直接使用FontWeight.Bold即可,该字重是所有系统版本默认中文字体都支持的档位,不需要额外引入资源。

注意:不推荐通过描边、缩放等绘制层效果模拟字重,这类方案渲染出的文字边缘发虚,会明显降低阅读体验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 04:09:24