addFontWeightStyle NoSuchMethodException для TextView - PullRequest
0 голосов
/ 15 февраля 2019

Я использую библиотеку Androidx для своего проекта, и я хочу установить шрифт в textview , поэтому при применении любого шрифта к любому Textview компонентов, которые дает мне система

TypefaceCompatApi21Impl: java.lang.NoSuchMethodException java.lang.NoSuchMethodException: addFontWeightStyle [класс java.lang.String], 101 * *.2, boole1013 *

Этот тип ошибки во время выполнения, но приложение не получает сбой.

Так, как преодолеть эту ошибку.

Примечание : Это будет правильно работать набез зависимости 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>

IЯ также устанавливаю шрифт программно как этот

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

все еще получаю эту ошибку

Ответы [ 8 ]

0 голосов
/ 23 февраля 2019

Вы пытались удалить последний параметр при программной установке гарнитуры?

getTitleView().setTypeface(typeFace)

вместо

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

внутренне использует fontStyle

0 голосов
/ 20 февраля 2019

О проблеме сообщили в команде Android , и, похоже, это исправление для будущего выпуска:

Согласно комментарию № 25 ниже работает версия

implementation 'androidx.appcompat:appcompat:1.1.0-alpha03'
implementation 'androidx.core:core-ktx:1.1.0-alpha05'
0 голосов
/ 21 февраля 2019

Просто внимательно прочитайте трассировку стека - это проблема с AndroidX.Кажется, что androidx.core.graphics.TypefaceCompatApi21Impl() пытается статически разрешить метод с сигнатурой addFontWeightStyle(lass java.lang.String, int, boolean) из некоторого внутреннего в класс фреймворка android.graphics.FontFamily посредством отражения ... и оказывается, что метод не существует.У меня та же проблема с androidx.appcompat.widget.AppCompatAutoCompleteTextView.Мы мало что можем сделать, пока Google не исправит это.

0 голосов
/ 19 февраля 2019

Я удаляю эту строку из моего xml-файла и теперь работаю без ошибок

android:textStyle="bold"

примерно addFontWeightStyle Mehtod, который генерирует исключение NoSuchMethodException в API21 Impl

0 голосов
/ 19 февраля 2019

Для некоторых исследований я обнаружил, что решение может оказаться полезным, на самом деле я использую альфа-зависимость, которая нестабильна, поэтому я понижаю версию lib для AndroidX

Я использую эту зависимость

 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'
0 голосов
/ 18 февраля 2019

По-видимому, это происходит, когда метод, как ожидается, будет общедоступным (или, если он не существует, что, я считаю, не так), и нет, согласно методу 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.

0 голосов
/ 15 февраля 2019

Ваш родительский стиль - @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>
0 голосов
/ 15 февраля 2019

Попробуйте:

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