"Родной шрифт не может быть создан" только для некоторых людей

У меня есть приложение, которое изменяет шрифт шрифта для некоторых элементов. Это хорошо работает для большинства людей, но, возможно, 0,5% получают исключение при попытке изменить шрифт. Значительная часть трассировки стека такова:

Caused by: java.lang.RuntimeException: native typeface cannot be made
at android.graphics.Typeface.<init>(Typeface.java:147)
at android.graphics.Typeface.createFromAsset(Typeface.java:121)

Как я уже сказал, он работает для большинства людей, поэтому я не думаю, что это проблема с файлом шрифта или моим кодом. Любые предложения о том, как это решить?

Изменить: Это мой код:

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                                 "fonts/CharisSILR.ttf");
TextView tv;
tv = ((TextView) findViewById(R.id.searchPronunciationTitle));
tv.setTypeface(phoneticFont);

Ответ 1

Эта ошибка ОС Android может быть причиной вашей проблемы:

Typeface.createFromAsset утечка потока ресурсов

Где также обходной путь в этом сообщении:

Я изменил обходной путь HTH, так что метод не предполагает шрифт путь или формат. Полный путь к объекту шрифта должен быть представлен как параметр. Я также завернул вызов createFromAsset() в блок try-catch, чтобы метод get() возвращал значение null, если актив не найден.

public class Typefaces {
    private static final String TAG = "Typefaces";

    private static final Hashtable<String, Typeface> cache = new Hashtable<String, Typeface>();

    public static Typeface get(Context c, String assetPath) {
        synchronized (cache) {
            if (!cache.containsKey(assetPath)) {
                try {
                    Typeface t = Typeface.createFromAsset(c.getAssets(),
                            assetPath);
                    cache.put(assetPath, t);
                } catch (Exception e) {
                    Log.e(TAG, "Could not get typeface '" + assetPath
                            + "' because " + e.getMessage());
                    return null;
                }
            }
            return cache.get(assetPath);
        }
    }
}

Ответ 2

Я следил за некоторыми решениями, найденными здесь, без успеха. Я думал, что это что-то действительно неясно, как это часто делают программисты. Тогда где-то я читал, что это может быть связано с путём шрифтов, gotcha:

Вместо:

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                             "blanch_caps.ttf");   

Я изменил на:

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                             "fonts/blanch_caps.ttf");   

И мой файл находится в файле /fonts/blanch _caps.ttf. Не работает это как шарм!

Ответ 3

Эта ошибка возникла, когда шрифт находился в папке с библиотечными ресурсами. Когда я скопировал его в активы приложения, использующего эту библиотеку, ошибка исчезла.

Кажется, что активы не могут быть импортированы: Папка активов библиотеки Android не копируется

И вот некоторые другие случаи: Проблема при использовании пользовательского шрифта - "родной шрифт не может быть создан"

Ответ 4

Я много боролся с этим. Я пробовал каждую возможность, и ничего не помогает. В конце концов, проблема была где-то еще. Если вы строите проект с помощью Gradle, не забудьте добавить эти строки в файл build.gradle. Это решило проблему в моем случае.

    sourceSets {
    main {
        assets.srcDirs = ['assets']
    }
}

Ответ 5

Вы должны создать папку с ресурсами внутри src main в AndroidStudio. Этот способ работает!

Ответ 6

В моем случае это было основано на имени файла шрифта. По какой-то причине это было названо FontName..ttf

Я не знаю, почему были двойные точки - я искал оригинальный шрифт, и они были в моей папке windows\fonts как FontName..ttf. Кажется, Windows не волновала, но Android испугался. Я переименовал файл, и теперь он счастлив.

Ответ 7

В моем случае я обнаружил, что папка активы расположена в /main/java/assets, но они должны быть в /main/assets

Ответ 8

Сделайте в нижнем регистре:

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                             "fonts/charissilr.ttf");

Не забудьте также переименовать файл.

Ответ 9

Измените этот

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                             "fonts/CharisSILR.ttf");

к

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                             "CharisSILR.ttf");

Ответ 10

Я просто столкнулся с этой проблемой, когда я использовал MagicTextView по qwerjk. Я попытался поместить класс MTV в библиотеку и использовать его в своем основном проекте. Вот как я заработал:

  • В папке основных ресурсов проекта создайте подпапку под названием fonts
  • Скопируйте файл ttf в папку assets/fonts. Мое имя файла было camelcase (например, ReservoirGrunge.ttf), и поэтому колпачки или крышки не кажутся важными.
  • В моем основном проекте я раздул MTV-представление из xml. Убедитесь, что MagicTextView указывает на правильный путь к библиотеке. Например, моя библиотека классов MTV была com.library.library_magictextview.MagicTextView, поэтому мой основной вид xml должен был читать:

        <com.library.library_magictextview.MagicTextView
        android:textSize=           "50dp"
        android:textColor=          "#ffffffff"
        android:layout_width=       "fill_parent"
        android:layout_height=      "wrap_content"
    
        android:textStyle=          "bold"
        android:padding=            "20dp"
        android:gravity=            "center"
    
        r:strokeColor=          "#FFff0000"
        r:strokeJoinStyle=      "miter"
        r:strokeWidth=          "5"
        r:typeface=         "ReservoirGrunge"
        android:text=               "BobDillon" />
    

Ответ 11

В нашей ситуации мы использовали решение Hit с кешем. Проблема, которую мы ввели, заключалась в том, что мы тестировали файлы OTF и файлы TTF в одном и том же блоке try;) Очевидно, что с первой попытки OTF произойдет неудача, если вы хотите получить TTF, но я думал, что стоит опубликовать JUST incase он проскользнул, когда кто-то заметил, пока они могут попробовать одно и то же решение.

protected static Typeface getTypeface(Context p_context, String p_fontName){
    Typeface tf = null;
    try {
        tf = Typeface.createFromAsset(p_context.getAssets(), "fonts/" + p_fontName + ".otf");
    }catch(Exception e) {}

    if( tf != null ) return tf;

    try {
        tf = Typeface.createFromAsset(p_context.getAssets(), "fonts/" + p_fontName + ".ttf");
    }catch(Exception e) {}

    return tf;
}

Ответ 12

В моем случае я просто удалил папку с ресурсами (которую я создал вручную) и только что создал новую с помощью мастера. По-видимому, он не был прочитан как папка с ресурсами, а прочитан как обычная папка, поэтому getAssets() не работал и дал мне ошибку.

Ответ 13

в студии android: что сработало для меня - это положить файл ttf прямо в папку с ресурсами без подпапки шрифтов, он не работал с подпапкой ((getAssets(), "fonts/oldengl.ttf" ) не работал, когда у меня был ttf в src/main/assets/fonts). это работает: SRC/главная/активы/oldengl.ttf Typeface customfont = Typeface.createFromAsset(getAssets(), "oldengl.ttf" );

Ответ 14

Я столкнулся с этой проблемой, когда импортировал модуль, предназначенный для поддержки проектов стиля eclipse и проекта стиля студии Android.

Я решил решить эту проблему, удалив активы из исходного набора как -

defaultConfig {
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName '1.0'

        sourceSets {
            main {
                java.srcDirs = ['src']
                res.srcDirs = ['res']
                //assets.srcDirs = ['assets']//commented this out because modlue was not having this directory
                manifest.srcFile 'AndroidManifest.xml'
            }
        }
    }

Или преобразование проекта в стиль студии Android может также решить проблему, я думаю.

Ответ 15

В моем случае

Я просто использую предыдущий код. Поэтому я забыл файл шрифта в папке с ресурсами.

Но я не могу разобраться в течение 2 часов.

Возможные случаи для этой ошибки,

  • Отсутствует файл шрифта
  • Неверное имя шрифта или неправильное расширение шрифта

для ex: шрифты /roboto.ttf вместо шрифтов/roboto.otf