我正在为我的项目使用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)
仍然收到此错误
对于一些研究,我发现解决方案可能对我有帮助,实际上我使用的是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'
该问题已报告给Android team,似乎是未来版本的修复:
根据评论#25以下版本的作品
implementation 'androidx.appcompat:appcompat:1.1.0-alpha03'
implementation 'androidx.core:core-ktx:1.1.0-alpha05'
我从我的xml文件中删除了这一行,现在可以正常工作
android:textStyle="bold"
是关于addFontWeightStyle方法,它在API 21 Impl中抛出NoSuchMethodException
只需仔细阅读堆栈跟踪 - 这是AndroidX的一个问题。似乎androidx.core.graphics.TypefaceCompatApi21Impl()
试图通过反射从一些内部到框架类addFontWeightStyle(lass java.lang.String, int, boolean)
静态地解决一个带有签名android.graphics.FontFamily
的方法......事实证明该方法不存在。我和androidx.appcompat.widget.AppCompatAutoCompleteTextView
有同样的问题。在Google修复它之前我们无能为力。
试试这个:
<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"/>
你的风格父母是@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中的某种错误。
以编程方式设置字体时是否尝试删除最后一个参数?
getTitleView().setTypeface(typeFace)
代替
getTitleView().setTypeface(typeFace, Typeface.NORMAL)
内部正在使用fontStyle