TextView上的addFontWeightStyle NoSuchMethodException

问题描述 投票:46回答:8

我正在为我的项目使用Androidx库,并且我想将字体设置为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)

仍然收到此错误

android material-design androidx
8个回答
26
投票

对于一些研究,我发现解决方案可能对我有帮助,实际上我使用的是alpha依赖,这是不稳定所以我降级了Android的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'

16
投票

该问题已报告给Android team,似乎是未来版本的修复:

根据评论#25以下版本的作品

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

5
投票

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

android:textStyle="bold"

是关于addFontWeightStyle方法,它在API 21 Impl中抛出NoSuchMethodException


5
投票

只需仔细阅读堆栈跟踪 - 这是AndroidX的一个问题。似乎androidx.core.graphics.TypefaceCompatApi21Impl()试图通过反射从一些内部到框架类addFontWeightStyle(lass java.lang.String, int, boolean)静态地解决一个带有签名android.graphics.FontFamily的方法......事实证明该方法不存在。我和androidx.appcompat.widget.AppCompatAutoCompleteTextView有同样的问题。在Google修复它之前我们无能为力。


2
投票

试试这个:

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

并将此主题应用于textview,如下所示

<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"/>

2
投票

你的风格父母是@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>

2
投票

显然,当方法预期公开(或者如果不存在,我认为不是这种情况)并且不是,根据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中的某种错误。


2
投票

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

getTitleView().setTypeface(typeFace)

代替

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

内部正在使用fontStyle

© www.soinside.com 2019 - 2024. All rights reserved.