2010-06-11 4 views
52

Я пытаюсь использовать специальный шрифт для TextView на Android, следуя руководству here и here. Используя тот же шрифт, тот же самый код, так же все, я получаю это в ADB LogCat:«RuntimeException: родной шрифт не может быть создан» при загрузке шрифта

W/dalvikvm( 317): threadid=1: thread exiting with uncaught exception (group=0x4001d800) 
E/AndroidRuntime( 317): FATAL EXCEPTION: main 
E/AndroidRuntime( 317): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.evilx.quacklock/org.evilx.quacklock.MainActivity}:    java.lang.RuntimeException: native typeface cannot be made 
E/AndroidRuntime( 317):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 
E/AndroidRuntime( 317):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
E/AndroidRuntime( 317):  at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
E/AndroidRuntime( 317):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
E/AndroidRuntime( 317):  at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime( 317):  at android.os.Looper.loop(Looper.java:123) 
E/AndroidRuntime( 317):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
E/AndroidRuntime( 317):  at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime( 317):  at java.lang.reflect.Method.invoke(Method.java:521) 
E/AndroidRuntime( 317):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
E/AndroidRuntime( 317):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
E/AndroidRuntime( 317):  at dalvik.system.NativeStart.main(Native Method) 
E/AndroidRuntime( 317): Caused by: java.lang.RuntimeException: native typeface cannot be made 
E/AndroidRuntime( 317):  at android.graphics.Typeface.<init>(Typeface.java:147) 
E/AndroidRuntime( 317):  at android.graphics.Typeface.createFromAsset(Typeface.java:121) 
E/AndroidRuntime( 317):  at org.evilx.quacklock.MainActivity.onCreate(MainActivity.java:24) 
E/AndroidRuntime( 317):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
E/AndroidRuntime( 317):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
E/AndroidRuntime( 317):  ... 11 more 
W/ActivityManager( 59): Force finishing activity org.evilx.quacklock/.MainActivity 
W/ActivityManager( 59): Activity pause timeout for HistoryRecord{43e80368 org.evilx.quacklock/.MainActivity} 
D/dalvikvm( 247): GC_EXPLICIT freed 711 objects/53160 bytes in 20922ms 

Хм ... хорошо. Я использую шрифт Molot.otf, который был успешно использован в одном из блогов. Я также использую predator.ttf, другой пользовательский шрифт, но в формате TrueType

Соответствующий код:

public class MainActivity extends Activity { 
     /** Called when the activity is first created. */ 
     @Override 
     public void onCreate(Bundle icicle) { 
      super.onCreate(icicle); 
      Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/Molot.otf"); 
      TextView tv = (TextView) findViewById(R.id.CustomFontText); 
      tv.setTypeface(tf); 
     } 
    } 

и

 
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <TextView 
     android:id="@+id/CustomFontText" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="30sp" 
     android:text="Here is some text."> 
     </TextView> 
</LinearLayout> 

Что бы быть причиной этого? Это работало для людей в блогах, так почему бы и нет? Что-то существенное изменение в API, которое мешает мне сделать это?

+6

У меня возникла эта ошибка и я подумал, что это значит, тогда я понял что это произошло потому, что ** он не мог найти файл для загрузки **. Несмотря на то, что это сообщение не связано с этим сообщением, которое я даже не читал, я публикую его здесь, потому что это единственный результат, который я получаю от поиска в Google для этой ошибки, поэтому я думаю, что это все равно стоит заметить. –

+1

Я думаю, что это была проблема и в моей ситуации, но я не уверен. Я закончил делать много возиться и как-то получил его на работу – TheLQ

+2

Очевидно, Android также не нравится ситуация, когда имя файла шрифта не совпадает с (встроенным) именем шрифта. Я получил то же самое исключение после простого переименования файла ttf. – mvds

ответ

44

Android не поддерживает OpenType (OTF), только TrueType (TTF), поэтому шрифт Molot.otf, вероятно, не будет работать. Я написал оба этих сообщения в блоге, на которые вы ссылаетесь в своем вступительном предложении (один из них является пиратской копией другого), и они не используют Molot.otf.

(BTW, я несколько исправил форматирование этого сообщения - AndroidGuys постоянно меняет хосты WordPress, и поэтому мои старые сообщения ужасно нарушаются с точки зрения форматирования).

EDIT: Как указано в комментариях, Android ДЕЛАЕТ теперь поддерживает OTF.

+1

Но почему бы работать с этим шрифтом TrueType? Существуют ли их различные типы TTF? – TheLQ

+1

@ Lord.Quackstar: Извините, я думал, что TrueType шрифт работает на вас. Как сообщают в блоге, Android не нравится все шрифты. Раньше это был тихий провал, но это было два года назад - возможно, сейчас он падает. Кроме того, убедитесь, что шрифт находится в каталоге, который вы указываете в своей области активов. В настоящее время вы также можете загрузить шрифт из файловой системы - см. Статический метод 'createFromFile()', чтобы вы могли попробовать попробовать. Вы можете загрузить шрифт HandmadeTypewriter, который я использовал в этом сообщении, поскольку я знаю, что это работает, поэтому, если это не поможет вам, это не шрифт, а что-то еще с вашей средой. – CommonsWare

+0

HandmadeTypewriter и отдельная программа, которую я нашел, чтобы перечислить все каталоги ресурсов. В настоящее время понижение до 2.1. Спасибо – TheLQ

26

Я также получаю ту же ошибку, и у меня есть решение.

Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/Molot.otf") 

вы должны поместить в fonts/Molot.otfassets/fonts папку в Eclipse.

после этого вы можете его запустить.

если вы не можете запустить его преуспевающим вы можете отправить proplem через

+1

. Моя проблема была только опечаткой, но этот ответ помог ее выяснить. –

+0

У меня была такая же ошибка, что «родной шрифт не может быть создан», и это была опечатка. Я пытался получить доступ к шрифту из «/fonts/font.otf» вместо «fonts/font.otf». – speedynomads

9

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

  • Первый и самый важный: Файл найден!
  • Шрифт действителен на вашем устройстве.

Лучший способ - изменить файл шрифта для известного действительного файла шрифта.
Если это не удается, то это первая проблема.
Если нет, это второе, так что вам придется иметь дело с FontForge или искать другой шрифт.

+1

Спасибо, мамусо, это была моя проблема. У меня была опечатка в имени файла ... –

5

FYI. Моей причиной аварии является причина, вызванная Eclipse. Все, что я сделал, это просто очистить проект и снова бежать, тогда он работает.

Во-первых, я попробовал собственный шрифт в своем тестовом проекте, который я использую, чтобы попробовать некоторые новые функции. Он работал в первый раз. Но он не работал над проектом, над которым я работаю, пока не сделал, как описано выше.

Так что попробуйте как можно больше способов.

8

проверить имя и расширение шрифта. он чувствителен к регистру &, вероятно, все колпачки. например.

Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/MOLOT.OTF") 
3

Вы должны отредактировать свой шрифт с помощью программного обеспечения Fontlab в двоичном формате.

3

@deng его ответ работал для меня ":. Имени

контроля встречается шрифтом и расширения его чувствителен к регистру &, вероятно, все заглавных букв, например

Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/MOLOT.OTF") 
1

Android поддерживает OTF файлов для Гарнитуров, если.. вы столкнулись с этой проблемой, убедитесь, что вы задаете правильный путь для шрифта, например, если у вас есть файл fontname.otf, поместите его в папку шрифтов внутри папки с данными и создайте шрифт следующим образом:

Typeface typeface = Typeface.createFromAsset(getAssets(), "fonts/fontname.otf"); 

(аргумент пути не должен начинаться с «/»), и имя файла не должно содержать специальных символов или «-» и должно быть в нижнем регистре