在 TextView 上添加 FontWeightStyle NoSuchMethodException

addFontWeightStyle NoSuchMethodException on TextView

我正在为我的项目使用 Androidx 库,我想将 font 设置为 textview,所以当我将任何字体应用到任何 Textview 组件时,系统给我的

TypefaceCompatApi21Impl: java.lang.NoSuchMethodException java.lang.NoSuchMethodException: addFontWeightStyle [class java.lang.String, int, boolean]

此类错误在 运行 时间内出现,但应用程序未崩溃。

那么如何克服这个错误。

注意:它可以在没有 android x 依赖的情况下正常工作。

下面是我的代码:

<androidx.appcompat.widget.AppCompatTextView
        android:id="@+id/menu_tv_title"
        style="@style/font_work_sans_medium"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:maxLines="1"
        android:ellipsize="end"
        android:paddingEnd="@dimen/_12sdp"
        android:paddingStart="@dimen/_12sdp"
        android:textColor="@android:color/black"
        android:textSize="17sp"
        android:gravity="center"
        tools:text="title"
        tools:visibility="gone"/>

样式如下

<style name="font_work_sans_medium" parent="@android:style/TextAppearance.Small">
    <item name="android:fontFamily">@font/work_sans_medium</item>
</style>

我也像这样以编程方式设置字体

var typeFace: Typeface? = ResourcesCompat.getFont(context, R.font.work_sans_bold)
    getTitleView().setTypeface(typeFace, Typeface.NORMAL)

仍然收到此错误

试试这个:

 <style name="CutsomFontTextView" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="android:fontFamily">@font/yourfont</item>
</style>

并将这个主题应用到文本视图,如下所示

<androidx.appcompat.widget.AppCompatTextView
    android:id="@+id/menu_tv_title"
    android:theme="@style/CutsomFontTextView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:maxLines="1"
    android:ellipsize="end"
    android:paddingEnd="@dimen/_12sdp"
    android:paddingStart="@dimen/_12sdp"
    android:textColor="@android:color/black"
    android:textSize="17sp"
    android:gravity="center"
    tools:text="title"
    tools:visibility="gone"/>

您的样式父级是 @android:style/TextAppearance.Small 点击它。你只会看到两项

<item name="textSize">14sp</item>
        <item name="textColor">?textColorSecondary</item>

所以错误是正确的。那种风​​格里面没有 fontFamily 属性。

尝试将您的父主题更改为

<style name="font_work_sans_medium" parent="Base.Theme.AppCompat.Light.DarkActionBar">
 <item name="android:fontFamily">@font/work_sans_medium</item>
</style>

显然,根据 Class.java 方法(查看在下方评论):

private Method getMethod(String name, Class<?>[] parameterTypes, boolean recursivePublicMethods)
        throws NoSuchMethodException {
    if (name == null) {
        throw new NullPointerException("name == null");
    }
    if (parameterTypes == null) {
        parameterTypes = EmptyArray.CLASS;
    }
    for (Class<?> c : parameterTypes) {
        if (c == null) {
            throw new NoSuchMethodException("parameter type is null");
        }
    }
    Method result = recursivePublicMethods ? getPublicMethodRecursive(name, parameterTypes)
                                           : getDeclaredMethodInternal(name, parameterTypes);
    ***// Fail if we didn't find the method or it was expected to be public.***
    if (result == null ||
        (recursivePublicMethods && !Modifier.isPublic(result.getAccessFlags()))) {
        throw new NoSuchMethodException(name + " " + Arrays.toString(parameterTypes));
    }
    return result;
}

我认为这是 Androidx 中的某种错误。

对于一些研究,我发现解决方案可能对我有帮助,实际上我使用的是不稳定的 alpha 依赖项,所以我降级了 AndroidX 的 lib 版本

我正在使用这个依赖项

 implementation 'androidx.core:core-ktx:1.1.0-alpha04'
 implementation 'androidx.appcompat:appcompat:1.1.0-alpha02'

你应该使用这个而不是

implementation 'androidx.core:core-ktx:1.0.1'
implementation 'androidx.appcompat:appcompat:1.0.2'

我从我的 xml 文件中删除了这一行,现在可以正常工作了

android:textStyle="bold"

是关于 addFontWeightStyle 方法,它在 API21 Impl

中抛出 NoSuchMethodException

该问题已报告给 Android team,并且似乎已在未来版本中修复:

根据以下版本的评论 #25

implementation 'androidx.appcompat:appcompat:1.1.0-alpha03'
implementation 'androidx.core:core-ktx:1.1.0-alpha05'

请仔细阅读堆栈跟踪 - 这是 AndroidX 的问题。似乎 androidx.core.graphics.TypefaceCompatApi21Impl() 试图通过反射从框架 class android.graphics.FontFamily 的某些内部静态解析具有签名 addFontWeightStyle(lass java.lang.String, int, boolean) 的方法......结果证明该方法没有'不存在。我与 androidx.appcompat.widget.AppCompatAutoCompleteTextView 有同样的问题。在 Google 修复它之前我们无能为力。

您是否尝试过在以编程方式设置字体时删除最后一个参数?

getTitleView().setTypeface(typeFace)

而不是

getTitleView().setTypeface(typeFace, Typeface.NORMAL)

内部正在使用字体样式

这里是编码的新手,但是如果您通过 Build/'Edit Libraries and Dependencies' 进入工具栏并单击 建议,点击更新androidx.appcompat:appcompat:X.X.X,会修复错误而不是在 build.gradle 文件中修复错误:)