java - "RuntimeException: non è possibile creare un carattere tipografico nativo" durante il caricamento del font




android android-fonts (6)

Sto tentando di utilizzare un carattere personalizzato per un TextView su Android, seguendo la guida here e here . Usando lo stesso font, stesso codice, stesso tutto, ottengo questo in adb logcat:

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. Sto usando il carattere Molot.otf, che è stato usato con successo in uno dei blog. Sto anche usando predator.ttf, un altro font personalizzato ma in formato TrueType

Codice pertinente:

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

e

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

Cosa potrebbe causare questo? Ha funzionato per le persone nei blog, quindi perché non io? È cambiato qualcosa di significativo nell'API che mi impedisce di farlo?


@deng la sua risposta ha funzionato per me ":

controlla il nome e l'estensione del font. è case sensitive e probabilmente tutte maiuscole. per esempio.

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

Android non supporta OpenType (OTF), solo TrueType (TTF), quindi probabilmente il tuo font Molot.otf non funzionerà. Ho scritto entrambi i post del blog a cui ti colleghi nella tua frase di apertura (quella è una copia pirata dell'altro) e non usano Molot.otf .

(A proposito, ho in qualche modo riparato la formattazione di quel post - AndroidGuys continua a cambiare gli host di WordPress, e quindi i miei post precedenti sono terribilmente interrotti in termini di formattazione).

EDIT : come indicato nei commenti, Android ora supporta OTF.


Android supporta i file OTF per i caratteri tipografici, se stai affrontando questo problema, assicurati di impostare il percorso corretto per il font font.put nei caratteri della cartella all'interno della cartella delle risorse e crea il carattere tipografico come di seguito:

Typeface typeface = Typeface.createFromAsset(getAssets(), "font/StencilStd.otf");
TextView text = (TextView) findViewById(R.id.textView);
text.setTypeface(typeface);

Dovresti modificare il tuo font con il software "Fontlab" in mod binario.


Ho anche lo stesso errore e ho seguito la soluzione.

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

devi mettere i fonts/Molot.otf nella cartella assets/fonts in Eclipse.

dopo puoi eseguirlo.

se non riesci a eseguirlo con successo, puoi inviarlo tramite


Sfortunatamente, il carattere tipografico non può essere reso errore non è molto specifico, e può essere il risultato di molte cose che vanno storte. È importante verificare due cose:

  • Il primo e il più importante: il file è stato trovato!
  • Il carattere è valido nel tuo dispositivo.

Il modo migliore è modificare il file di font per un file di font valido conosciuto.
Se fallisce, allora è il primo problema.
Altrimenti, è il secondo, quindi dovrai occuparti di FontForge o cercare un altro font.