2010-06-11 6 views
52

Ich versuche, eine benutzerdefinierte Schriftart für ein TextView auf Android zu verwenden, nach der Anleitung here und here. Unter Verwendung der gleichen Schriftart, denselben Code, alles gleich, ich dies in adb logcat:"RuntimeException: native Schriftart kann nicht erstellt werden" beim Laden von Schriftart

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 

Hmm ... okay. Ich verwende die Schriftart Molot.otf, die erfolgreich in einem der Blogs verwendet wurde. Ich verwende auch predator.ttf, eine andere benutzerdefinierte Schriftart aber im Truetype-Format

Relevante Code:

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); 
     } 
    } 

und

 
<?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> 

Was verursacht werden würde? Es hat für die Leute in den Blogs funktioniert, also warum nicht ich? Hat sich etwas an der API geändert, das mich davon abhält?

+6

Ich habe diesen Fehler und fragte mich, was es bedeutete, dann habe ich herausgefunden dass es passiert ist, weil ** die zu ladende Datei nicht gefunden werden konnte **. Obwohl dies vielleicht nichts mit diesem Post zu tun hat, den ich noch nicht einmal gelesen habe, poste ich ihn hier, weil es das einzige Ergebnis ist, das ich bei Google bekomme, wenn ich nach diesem Fehler suche. –

+1

Ich denke, das war das Problem in meiner Situation, aber ich bin mir nicht sicher. Ich endete damit, viel zu basteln, und irgendwie funktionierte es. – TheLQ

+2

Offenbar mag Android auch nicht die Situation, in der der Font-Dateiname nicht mit dem (eingebetteten) Namen der Schriftart übereinstimmt. Ich habe genau die gleiche Ausnahme nach dem Umbenennen der ttf-Datei. – mvds

Antwort

44

Android unterstützt nicht OpenType (OTF), nur TrueType (TTF), so dass Ihre Schriftart Molot.otf wahrscheinlich nicht funktioniert. Ich habe beide Blogposts geschrieben, auf die Sie in Ihrem Eröffnungssatz verlinken (der eine ist eine Raubkopie des anderen), und sie verwenden Molot.otf nicht.

(BTW, ich reparierte etwas die Formatierung dieses Beitrags - AndroidGuys ändert WordPress-Hosts, und so sind meine älteren Beiträge in Bezug auf Formatierung schrecklich gebrochen).

EDIT: Wie in den Kommentaren erwähnt, Android DOES jetzt OTF unterstützen.

+1

Aber warum sollte eine funktionierende TrueType-Schrift dann scheitern? Sind ihre verschiedenen Arten von TTFs da draußen? – TheLQ

+1

@ Lord.Quackstar: Entschuldigung, ich dachte, die TrueType-Schrift würde für Sie arbeiten. Wie die Blogposts zeigen, mag Android nicht alle Schriften. Es war ein stiller Misserfolg, aber das war vor zwei Jahren - vielleicht stürzt es jetzt ab. Stellen Sie außerdem sicher, dass sich die Schriftart in dem Verzeichnis befindet, das Sie in Ihrem Anlagenbereich festlegen. Heutzutage können Sie auch eine Schriftart aus dem Dateisystem laden - sehen Sie sich die statische 'createFromFile()' Methode an, damit Sie es versuchen können. Sie können die HandmadeTypewriter-Schriftart herunterladen, die ich in diesem Beitrag verwendet habe, da ich weiß, dass das funktioniert. Wenn das also nicht funktioniert, ist es nicht die Schriftart, sondern etwas anderes mit Ihrer Umgebung. – CommonsWare

+0

HandmadeTypewriter und ein separates Programm, das ich gefunden habe, um das Verzeichnis der Assets aufzulisten, ist fehlgeschlagen. Derzeit wird auf 2.1 herabgestuft. Danke – TheLQ

26

Ich bekomme auch den gleichen Fehler und ich habe die Lösung folgen.

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

Sie in Eclipse setzen fonts/Molot.otf in assets/fonts Ordner muss.

nachdem Sie es ausführen können.

wenn Sie nicht ausführen können es erfolgreiche Sie proplem über

+1

gerendert. Mein Problem war nur ein Tippfehler, aber diese Antwort half, es herauszufinden. –

+0

Ich hatte den gleichen Fehler "native Schriftart kann nicht gemacht werden" und es war ein Tippfehler. Ich habe versucht, von "/fonts/font.otf" anstatt von "fonts/font.otf" auf die Schriftart zuzugreifen. – speedynomads

9

Leider senden können, die Schrift kann nicht Fehler gemacht werden, ist nicht sehr spezifisch, und es kann das Ergebnis vieler Dinge gehen falsch. Es ist wichtig, nach zwei Dingen zu suchen:

  • Die erste und wichtigste: Die Datei ist gefunden!
  • Die Schriftart ist in Ihrem Gerät gültig.

Der beste Weg ist, Ihre Schriftart-Datei für eine bekannte gültige Schriftart-Datei zu ändern.
Wenn es fehlschlägt, dann ist es das erste Problem.
Wenn nicht, ist es die zweite, so müssen Sie sich mit FontForge beschäftigen oder nach einer anderen Schriftart suchen.

+1

Danke mamuso, das war genau mein Problem. Ich hatte einen Tippfehler im Dateinamen ... –

5

FYI. Mein Grund für den Absturz ist ein Grund, der von Eclipse verursacht wurde. Alles, was ich getan habe, ist nur das Projekt zu reinigen und wieder ausgeführt, dann funktioniert es.

Zuerst habe ich versucht, die benutzerdefinierte Schriftart in meinem Testprojekt, die ich verwenden, um einige neue Funktionen auszuprobieren.Es arbeitete zum ersten Mal. Aber es funktionierte nicht an dem Projekt, an dem ich arbeite, bis ich wie oben gemacht habe.

Also versuchen Sie so viele Methoden wie möglich.

8

Überprüfen Sie den Namen und die Erweiterung der Schriftart. es ist Groß- und Kleinschreibung & wahrscheinlich alle Caps. z.B.

3

Sie müssen Ihre Schriftart mit 'Fontlab' Software in binärer Mod bearbeiten.

3

@deng seine Antwort war für mich ".

Name Check Schriftart und Erweiterung es Groß- und Kleinschreibung & ist wahrscheinlich alle Kappen zB

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

Android tut OTF-Dateien für Schriften unterstützen, wenn.. Wenn Sie mit diesem Problem konfrontiert sind, stellen Sie sicher, dass Sie den richtigen Pfad für die Schriftart festlegen, z. B. wenn Sie die Datei fontname.otf haben, legen Sie sie in einen Ordner fonts in assets ab und erstellen Sie die Schriftart wie folgt:

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

(Pfad Argument sollte nicht mit "/") und der Dateiname sollte keine Sonderzeichen oder ein "-" und sollte in Kleinbuchstaben