Android Studio 2020.3.1出现Unknown resource type fonts错误如何解决
错误原因
你混用了两种Android自定义字体的实现逻辑,同时引用路径写法错误,才会出现Unknown resource type fonts报错:
@fonts/xxx的引用方式属于Android官方Font in XML特性,要求字体文件必须存放在res/font目录下,且正确写法是@font/xxx(你多写了一个s)- 你当前的字体实际存放在
assets/fonts目录下,这种方式只能通过代码动态加载,不能直接用@font/xxx在XML中引用
解决方法
你可以根据自己的需求选择以下任意一种方案:
方案1:保留现有assets动态加载逻辑
- 删除XML中
android:fontFamily="@fonts/zaxo"配置,删除style.xml中<item name="android:fontFamily">@fonts/zaxo</item>配置,你已经实现了app:font自定义属性和Java动态加载逻辑,不需要额外在XML硬编码字体配置,删除后报错直接消失 - 如果需要XML预览时显示自定义字体效果,可以用
tools:fontFamily="@font/zaxo"替代原有配置,该属性仅作用于预览阶段,不会参与打包,不会触发报错 - assets下的字体本身就不会出现在Android Studio的可视化字体选择列表中,属于正常现象,不影响实际运行效果
方案2:改用官方Font in XML方案(支持可视化选择字体)
- 在res目录下新建名为
font的文件夹,将所有字体文件拷贝到该目录下,注意字体文件名只能包含小写字母、数字和下划线,不能有大写字符或特殊符号 - 将原有XML和style中的
@fonts/zaxo修改为@font/zaxo,Unknown resource type fonts报错会直接消失 - 此时打开字体选择器,你添加的自定义字体会正常出现在列表中
- 如果需要保留动态切换字体的逻辑,可以将Java代码中
createFromAsset的逻辑替换为官方资源加载方式:
fromAsset = ResourcesCompat.getFont(context, R.font.zaxo);
额外优化建议
- 你当前工具类中的
currentTypeface和fromAsset为静态变量,会长期持有Context引用,存在内存泄漏风险,建议改为使用Application Context加载字体,或取消静态缓存逻辑 - 如果采用方案1,建议检查自定义
app:font属性对应的BindingAdapter实现,确保能正常调用工具类方法给TextView设置字体
内容的提问来源于stack exchange,提问作者ayman berwari
相关产品推荐
相关产品推荐

