字体资源无法获取。

29

我正在使用compileSdktargetSdk版本27并且在最近的版本中,我为我的项目使用了新的字体资源功能,但是一天后,这行代码导致了3次崩溃。

Typeface typeface = ResourcesCompat.getFont(this, R.font.my_font);

崩溃报告显示问题出在android.content.res.Resources$NotFoundException,无法检索到字体资源。所有3次崩溃都发生在安卓版本为5.1.1的用户身上。这是支持库的Bug还是我的操作有误?


1
getFont方法是在API版本26中添加的。详情请参考https://developer.android.com/reference/android/support/v4/content/res/ResourcesCompat.html#getFont(android.content.Context,%20int) - lib4backer
但我测试过了,在较低的API上也能正常工作 @lib4 - Amir_P
您能否把字体文件中的下划线去掉呢?有时会出现类似的问题,如 https://dev59.com/EFgQ5IYBdhLWcg3wMhLn。 - lib4backer
那只是一个例子。我的字体名称不同,并且没有下划线或其他特殊字符@lib4。 - Amir_P
@Amir_P 你找到解决这个问题的方法了吗? - Fartab
很不幸,我不记得我做了什么来避免这个问题 :( @Fartab - Amir_P
6个回答

10

我在API级别为16的Google Play服务9.2.56(模拟器)上使用可下载字体时遇到了相同的崩溃。

如果您正在使用此功能,则设备必须具有Google Play服务版本11或更高版本才能使用Google字体提供程序(请参见文档中的此注释)。


谢谢您的回答,但我没有使用可下载字体。 - Amir_P
@Shrikant 我刚刚使用了一个不同的模拟器。在真实设备上,你不应该遇到这个错误,因为这个版本的 Google Play 服务非常老旧。 - Vadim Kotov
3
但是我在真实设备上遇到了这个问题。 - Shrikant
@Shrikant 我也收到了一些来自真实设备的崩溃报告,我认为这个讨论可能会有所帮助。我会尝试根据链接重构我的代码。 - Vadim Kotov
如何测试Google Play服务的版本? - lorenzo

9

我曾经遇到过同样的问题,注意到文档中的一个细节有所帮助:

在XML布局中使用支持库声明字体族时,请使用app命名空间以确保您的字体能够加载。

<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:app="http://schemas.android.com/apk/res-auto">
  <font app:fontStyle="normal" app:fontWeight="400" app:font="@font/myfont-Regular"/>
  <font app:fontStyle="italic" app:fontWeight="400" app:font="@font/myfont-Italic" />
</font-family>

之前我一直使用的是“android”命名空间,切换到“app”命名空间后,可以使老版本设备上正确加载字体。


4
我使用的可下载字体没有奏效。:( - Anukool srivastav
看起来完成了工作,谢谢。测试通过。不过没有尝试可下载字体。 - j2emanue

3

使用 ResourcesCompat.getFont() 时,我在 R.font 中遇到了与 TTF 文件相关的相同问题。

结果发现 Android 不喜欢这个 TTF 文件,尽管 logcat 中没有信息,但调试显示 TypefaceCompat.createFromResourcesFontFile() 失败了。

我将该 TTF 文件替换为另一个类似的字体后,从此就没有遇到任何问题了。


0

在 API 等级 16 上使用可下载字体

这些字体需要下载,因此最好检查互联网连接并下载它们,即使它们来自字体文件夹。


0

我曾遇到相同的问题,所以我采用了另一种方法,这对我很有效。

  1. app/src/main 中新建一个名为 assets 的文件夹,并再次在其中创建一个名为 fonts 的子文件夹。

  2. 将字体文件(例如 poppins.ttf)添加到 fonts 子文件夹中。

  3. 如果您是 Java 开发者,则在 Activity/Fragment 文件中编写以下代码:

    Typeface font = Typeface.createFromAsset(getAssets(),"fonts/poppins.ttf"); yourTextView.setTypeface(font);

    如果您是 Kotlin 开发者,则可以使用以下代码:

    val customTypeFace = Typeface.createFromAsset(context.assets, "fonts/poppins-Light.ttf")

谢谢 :)


0
在我的情况下,即使将Gradle版本升级到最新版本也没有起作用。对我有效的是一个非常琐碎的解决方案,即将依赖项版本更新为最新版本。我不知道在你的情况下是否有效,但或许你应该试一试。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接