"Родной шрифт не может быть создан" только для некоторых людей
У меня есть приложение, которое изменяет шрифт шрифта для некоторых элементов. Это хорошо работает для большинства людей, но, возможно, 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