当将"targetSdkVersion"和"compileSdkVersion"更新为30时,针对类"android.graphics.FontFamily"出现"NoSuchMethodException"错误。

19

当我将compileSdkVersion更新为30时,在我的LoginActivity中调用setContentView的那一行就开始显示错误了(请参见下面的日志)

2020-06-22 13:43:21.205 14538-14538/com.gravty.everyday W/gravty.everyda: 访问隐藏方法 Landroid/graphics/FontFamily;->()V (greylist-max-q, reflection, denied) 2020-06-22 13:43:21.206 14538-14538/com.gravty.everyday E/TypefaceCompatApi26Impl: 无法收集所需的类java.lang.NoSuchMethodException的方法 java.lang.NoSuchMethodException: android.graphics.FontFamily. [] at java.lang.Class.getConstructor0(Class.java:2332) at java.lang.Class.getConstructor(Class.java:1728) at androidx.core.graphics.TypefaceCompatApi26Impl.obtainFontFamilyCtor(TypefaceCompatApi26Impl.java:321) at androidx.core.graphics.TypefaceCompatApi26Impl.(TypefaceCompatApi26Impl.java:84) at androidx.core.graphics.TypefaceCompatApi28Impl.(TypefaceCompatApi28Impl.java:36) at androidx.core.graphics.TypefaceCompat.(TypefaceCompat.java:47) at androidx.core.graphics.TypefaceCompat.findFromCache(TypefaceCompat.java:76) at androidx.core.content.res.ResourcesCompat.loadFont(ResourcesCompat.java:393) at androidx.core.content.res.ResourcesCompat.loadFont(ResourcesCompat.java:361) at androidx.core.content.res.ResourcesCompat.getFont(ResourcesCompat.java:339) at androidx.appcompat.widget.TintTypedArray.getFont(TintTypedArray.java:119)

在 androidx.appcompat.widget.AppCompatTextHelper.updateTypefaceAndStyle(AppCompatTextHelper.java:430) 中更新字体和样式。 在 androidx.appcompat.widget.AppCompatTextHelper.loadFromAttributes(AppCompatTextHelper.java:204) 中读取属性。 创建 androidx.appcompat.widget.AppCompatTextView.(AppCompatTextView.java:105)。 创建 androidx.appcompat.widget.AppCompatTextView.(AppCompatTextView.java:95)。 在 androidx.appcompat.app.AppCompatViewInflater.createTextView(AppCompatViewInflater.java:182) 中创建 TextView。 在 androidx.appcompat.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:103) 中创建视图。 在 androidx.appcompat.app.AppCompatDelegateImpl.createView(AppCompatDelegateImpl.java:1407) 中创建视图。 在 androidx.appcompat.app.AppCompatDelegateImpl.onCreateView(AppCompatDelegateImpl.java:1457) 中创建视图。 尝试从 LayoutInflater.java:1059 创建视图。 从 LayoutInflater.java:995 或 LayoutInflater.java:959 创建视图。 在 LayoutInflater.java:1121 中填充 include 标签。 在 LayoutInflater.java:680 中填充布局。 在 LayoutInflater.java:532 中填充布局。 在 LayoutInflater.java:479 中填充布局。在 androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:555) 中设置视图, 在 androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:161) 中设置视图, 在 com.gravty.everyday.views.activities.LoginActivity.onCreate(LoginActivity.java:53) 中创建 Login 活动, 在 android.app.Activity.performCreate(Activity.java:7989) 中执行创建操作, 在 android.app.Activity.performCreate(Activity.java:7978) 中执行创建操作。

1
请展示你的代码,并将错误信息放入 code 括号中。 - SkypeDogg
我也是。我知道解决方案是更新,但我现在无法这样做。你有任何负面影响吗?我现在没有看到任何异常行为。 (我知道更新是解决方案,但目前不可能) - AndyB
3个回答

38

我之前也遇到了同样的FontFamily's method not found错误。原因是:

TypefaceCompatApi26Impl.class //它所在的库缺失了

通过在gradle构建文件中添加核心库的稳定版本 implementation 'androidx.core:core:1.3.0' (https://developer.android.com/jetpack/androidx/releases/core),我成功解决了这个问题。

更新: 那些使用Appcompat库而不是核心库的人可以像@Thiago提到的那样,使用Appcompat库的稳定版本,即androidx.appcompat:appcompat:1.3.1 (https://developer.android.com/jetpack/androidx/releases/appcompat#version_131_3)。


2
有没有其他选择?针对那些没有迁移到AndroidX的人。 - RaffMag
1
@Garci 如果你遇到了 TypefaceCompatApi26Impl.class 缺失的问题,那么你可以尝试根据文档 https://developer.android.com/topic/libraries/support-library/packages#v4,在你的 gradle 文件中添加 'com.android.support:support-compat:28.0.0',否则你需要进行调试以找到缺失的类文件。 - Ashish

10

通过将appCompat库升级至:

implementation 'androidx.appcompat:appcompat:1.2.0'

已经解决了我的问题(与你的问题类似)


2
刚刚更新到1.3.0版本,问题得到了解决。 - Jahson kyalo
2
有什么建议适用于使用旧版 com.android.support:appcompat-v7 库的人吗? - Tum

1
在我的情况下,我忘记将我的IDE设置为“离线模式”,并清除了缓存。因此,在应用程序加载时,自定义字体丢失并无法下载。通过从Gradle -> 切换离线模式打开离线模式,我能够成功运行我的应用程序。

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