Android Studio中TextView fontFamily在Material主题中不生效问题咨询
嘿,我来帮你解决这个问题!其实不是Material主题不支持fontFamily属性,而是它的字体优先级逻辑和AppCompat不一样,再加上可能你没注意几个细节,导致自定义字体被默认字体覆盖了,我给你拆解清楚原因和解决办法:
核心原因:Material主题的字体优先级更高
Material主题(比如Theme.Material3.DayNight.NoActionBar这类)默认会应用Material Design 3的专属字体体系,它的全局字体配置优先级比你直接在TextView上设置的fontFamily要高,所以你的自定义字体就被“盖住”了。
针对性解决办法
方法一:修改主题全局字体(推荐)
直接在主题里指定你要的字体,这样所有控件都会继承,TextView的设置也能正常生效。打开styles.xml,修改你的Material主题:
<style name="AppTheme" parent="Theme.Material3.DayNight.NoActionBar"> <!-- 替换成你的自定义字体路径 --> <item name="android:fontFamily">@font/your_custom_font</item> <item name="fontFamily">@font/your_custom_font</item> <!-- 兼容低版本系统 --> </style>
方法二:给TextView单独设置文本样式
给TextView加上android:textAppearance属性,用Material的文本样式来绕过主题的默认字体优先级,这样你的fontFamily设置就会生效:
<TextView ... android:fontFamily="@font/your_custom_font" android:textAppearance="@style/TextAppearance.Material3.BodyLarge" />
这里的TextAppearance.Material3.BodyLarge可以换成你需要的其他Material3文本样式,比如HeadlineSmall之类的,根据你的需求来。
方法三:检查字体资源配置
确保你的字体文件已经正确放在res/font/目录下,引用的时候路径要正确。比如你的字体文件是roboto_regular.ttf,引用就要写成@font/roboto_regular,别直接写字体名称哦。另外,Material主题对可变字体支持更好,如果你的字体是静态字体,也要确认没有被主题的默认可变字体覆盖。
方法四:排查混淆问题
如果开启了代码混淆,可能会导致字体资源被误处理,你可以在proguard-rules.pro里添加保护规则:
-keep class androidx.core.graphics.** { *; } -keep class androidx.core.text.** { *; } -keep class android.graphics.Typeface { *; }
你的activity_main.xml补全示例
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/test_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="测试自定义字体" android:fontFamily="@font/your_custom_font" android:textAppearance="@style/TextAppearance.Material3.BodyLarge" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" android:marginStart="16dp" android:marginTop="16dp"/> </android.support.constraint.ConstraintLayout>
总结
说白了就是Material主题有自己的字体优先级规则,不是不支持自定义字体,而是需要调整设置方式来绕过默认的字体覆盖。按照上面的方法调整后,应该就能正常显示你想要的字体啦!
内容的提问来源于stack exchange,提问作者gldanoob

