Jetpack Compose中fontWeight属性不生效问题求助
根据你描述的「预览生效、真机/模拟器无效」的情况,大概率是以下几个原因导致的,逐个排查即可:
字体本身不支持目标字重
很多系统默认字体只包含有限的字重(比如仅400常规、700粗体),当你设置800这类超出字体支持范围的weight时,系统会自动 fallback 到最接近的可用字重,视觉上就没变化。
测试方法:先换成系统明确支持的字重比如FontWeight.Bold(对应700),看是否生效。如果生效,说明你的目标字重800不在当前字体的支持范围内。
解决办法:引入支持多字重的自定义字体,比如Google Fonts中的字体,通过FontFamily加载对应weight的字体文件。示例代码:// 先在res/font下放入对应字重的字体文件,比如myfont_regular.ttf、myfont_extrabold.ttf val myFontFamily = FontFamily( Font(R.font.myfont_regular, FontWeight.Normal), Font(R.font.myfont_extrabold, FontWeight(800)) ) Text( text = "Text Example", fontFamily = myFontFamily, fontWeight = FontWeight(800) )主题样式覆盖了局部设置
检查你的MaterialTheme中的Typography配置,可能全局的bodyLarge、titleMedium等样式已经指定了fontWeight,导致你在Text组件中设置的局部参数被覆盖。
解决办法:显式通过style参数指定样式,强制覆盖主题样式:Text( text = "Text Example", style = TextStyle(fontWeight = FontWeight(800)) )或者修改主题中的Typography配置,确保对应文本样式的fontWeight没有被固定。
构建缓存或渲染缓存问题
有时候Android Studio的构建缓存会导致样式不生效,试试:- 执行
Build -> Clean Project+Build -> Rebuild Project - 清理IDE缓存:
File -> Invalidate Caches...,勾选"Clear file system cache and local history"后重启IDE
- 执行
预览与运行时的字体渲染差异
Android Studio预览的字体渲染逻辑和真机/模拟器不完全一致,预览可能会模拟未被字体支持的字重,但真机上会严格使用字体的可用字重。这也是「预览生效、运行时无效」的常见原因,回到第一个原因排查即可。
内容的提问来源于stack exchange,提问作者Ron Petrosian

