如何创建含粗体的自定义字体族?XML字体无粗体属性且无法编程设置
解决XML自定义字体族无法设置粗体的问题
我之前在配置自定义XML字体族的时候也踩过这个坑!其实问题出在字体族的XML配置逻辑和编程设置的方式上,下面给你梳理清楚解决步骤:
1. 先正确配置字体族XML文件
XML字体族本身没有单独的"粗体属性",它的核心是关联对应字重的字体文件。你需要在res/font目录下创建字体族文件(比如my_font_family.xml),为不同字重(常规、粗体等)指定对应的字体文件:
<?xml version="1.0" encoding="utf-8"?> <font-family xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 常规字重(400) --> <font android:fontStyle="normal" android:fontWeight="400" android:font="@font/my_font_regular"/> <!-- 粗体字重(700) --> <font android:fontStyle="normal" android:fontWeight="700" android:font="@font/my_font_bold"/> </font-family>
这里要注意:必须同时提供常规和粗体对应的字体文件(比如my_font_regular.ttf和my_font_bold.ttf),并且fontWeight要和字体实际的字重匹配(400对应常规,700对应粗体是行业标准)。
2. 编程设置粗体的正确姿势
如果直接用textView.setTypeface(Typeface.DEFAULT_BOLD)会覆盖你的自定义字体,正确的做法是加载自定义字体族后,指定字重样式:
Kotlin示例:
// 加载自定义字体族 val customTypeface = ResourcesCompat.getFont(context, R.font.my_font_family) // 指定粗体样式,系统会自动匹配字体族里的粗体文件 textView.setTypeface(customTypeface, Typeface.BOLD)
兼容低版本(用TextViewCompat):
val customTypeface = ResourcesCompat.getFont(context, R.font.my_font_family) TextViewCompat.setTypeface(textView, customTypeface, Typeface.BOLD)
3. 避坑提示
- 不要只提供常规字重的字体文件:如果没有对应的粗体文件,系统会给常规字体加"伪粗体",效果发虚,而且可能无法正确响应粗体设置。
- 不要写错fontWeight数值:比如把粗体写成800,但你的字体文件实际是700字重,系统会找不到匹配的字体,依然用伪粗体。
内容的提问来源于stack exchange,提问作者Near1999




