Android Studio中TextView无法设置粗体样式问题求助
我之前碰到过一模一样的问题,大概率是因为你全局配置的Montserrat字体没有包含粗体字重的变体文件,或者系统无法正确找到对应的粗体字体导致的。下面是具体的排查和解决步骤:
一、核心原因分析
当你通过android:textStyle="bold"或者tvDashboard.setTypeface(null, Typeface.BOLD)设置粗体时,系统会尝试加载该字体对应的粗体字重版本(比如Montserrat-Bold.ttf)。如果你的@font/montserrat只是普通的Regular(400字重)字体,系统找不到匹配的粗体变体,就会出现设置无效的情况——甚至可能因为全局字体的优先级问题,连默认字体的粗体 fallback 都失效了。
二、具体解决方案
1. 确认是否存在Montserrat的粗体字体文件
打开你的项目res/font目录,检查是否有montserrat_bold.ttf(或类似命名,比如montserrat_700.ttf,对应700字重的粗体)。如果没有:
- 重新通过Android Studio的可下载字体功能,搜索Montserrat并勾选Bold字重进行添加;
- 或者手动从字体网站下载Montserrat的粗体版本,放到
res/font目录中。
2. 直接引用粗体字体文件(快速解决)
如果已经有粗体字体文件,你可以跳过全局textStyle的方式,直接给TextView指定粗体字体:
XML方式:
<TextView android:id="@+id/tvDashboard" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="@dimen/_45sdp" android:layout_marginTop="@dimen/_10sdp" android:text="@string/dashboard" android:textColor="@color/black" android:textSize="@dimen/_20sdp" android:fontFamily="@font/montserrat_bold" />这里不需要再设置
android:textStyle="bold",因为字体本身就是粗体。Java代码方式:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_dashboard); TextView tvDashboard = findViewById(R.id.tvDashboard); // 直接加载粗体字体 Typeface boldMontserrat = ResourcesCompat.getFont(this, R.font.montserrat_bold); tvDashboard.setTypeface(boldMontserrat); }
3. 配置字体族(规范全局字体方案)
如果你希望全局支持不同字重(Regular、Bold等),推荐创建字体族文件:
- 在
res/font目录下新建montserrat.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/montserrat_regular" /> <!-- 粗体字重(700) --> <font android:fontStyle="normal" android:fontWeight="700" android:font="@font/montserrat_bold" /> </font-family> - 修改
styles.xml中的主题配置,引用这个字体族:<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:fontFamily">@font/montserrat</item> <item name="fontFamily">@font/montserrat</item> <item name="android:windowTranslucentStatus">true</item> <item name="android:windowTranslucentNavigation">true</item> </style> - 之后再使用
android:textStyle="bold"或者setTypeface(null, Typeface.BOLD)就会自动加载对应的粗体变体了,系统能从字体族中匹配到正确的字重。
4. 排查样式覆盖问题
如果上面的方法都无效,打开Android Studio的Layout Inspector(Tools > Layout Inspector),查看该TextView的实际应用样式,确认是否有父布局、主题样式或者其他自定义样式覆盖了textStyle或fontFamily属性。
内容的提问来源于stack exchange,提问作者Abd Maj

