在 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 文件中修复错误:)
我正在为我的项目使用 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 文件中修复错误:)