64 votes

"RuntimeException : native typeface cannot be made" lors du chargement de la fonte

J'essaie d'utiliser une police personnalisée pour un TextView sur Android, en suivant le guide ici . En utilisant la même police, le même code, le même tout, j'obtiens ceci dans 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

J'utilise la police Molot.otf, qui a été utilisée avec succès dans l'un des blogs. J'utilise également predator.ttf, une autre police personnalisée mais au format TrueType.

Code pertinent :

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

et

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

Quelle en serait la cause ? Cela a fonctionné pour les personnes figurant sur les blogs, alors pourquoi pas pour moi ? Quelque chose d'important a changé dans l'API qui m'empêche de le faire ?

6 votes

J'ai eu cette erreur et je me suis demandé ce qu'elle signifiait, puis j'ai compris que cela se produisait parce que il n'a pas pu trouver le fichier à charger . Bien que cela n'ait aucun rapport avec ce message, que je n'ai même pas lu, je le publie ici parce que c'est le seul résultat que j'obtiens sur Google en cherchant cette erreur, donc je suppose que cela vaut la peine d'être signalé.

1 votes

Je pense que c'était aussi le problème dans ma situation, mais je ne suis pas sûr. J'ai fini par faire beaucoup de bricolage et j'ai réussi à le faire fonctionner.

2 votes

Apparemment, Android n'aime pas non plus les situations où le nom de fichier de la police ne correspond pas au nom (intégré) de la police. J'ai obtenu exactement la même exception après avoir simplement renommé le fichier ttf.

48voto

CommonsWare Points 402670

Android ne prend pas en charge OpenType (OTF), mais uniquement TrueType (TTF). Molot.otf La police de caractères ne fonctionnera probablement pas. J'ai écrit les deux articles de blog dont vous faites le lien dans votre première phrase (l'un est une copie pirate de l'autre), et ils n'utilisent pas de Molot.otf .

(BTW, j'ai quelque peu réparé le formatage de cet article - AndroidGuys continue de changer d'hébergeur WordPress, et donc mes anciens articles sont terriblement cassés en termes de formatage).

EDITAR : Comme indiqué dans les commentaires, Android FAIT supportent maintenant l'OTF.

1 votes

Mais pourquoi une police TrueType fonctionnelle échouerait-elle alors ? Existe-t-il différents types de TTF ?

1 votes

@Lord.Quackstar : Désolé, je pensais que la police TrueType fonctionnait pour vous. Comme l'indiquent les articles du blog, Android n'aime pas toutes les polices. Avant, c'était une panne silencieuse, mais c'était il y a deux ans - peut-être que ça plante maintenant. Vérifiez également que la police se trouve dans le répertoire que vous indiquez dans votre zone de ressources. Aujourd'hui, vous pouvez également charger une police à partir du système de fichiers - voir le fichier statique createFromFile() Vous pouvez donc essayer de le faire. Vous pouvez télécharger la police HandmadeTypewriter que j'ai utilisée dans cet article, car je sais qu'elle fonctionne. Si cela échoue pour vous, ce n'est pas la police qui est en cause, mais quelque chose d'autre dans votre environnement.

0 votes

HandmadeTypewriter et un programme séparé que j'ai trouvé pour lister le répertoire des actifs ont tous échoué. Je passe actuellement à la version 2.1. Merci

27voto

phuongnv Points 201

Je reçois également la même erreur et j'ai la solution suivante.

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

vous devez mettre fonts/Molot.otf en assets/fonts dans votre Eclipse.

après que vous puissiez l'exécuter.

Si vous n'arrivez pas à l'exécuter avec succès, vous pouvez envoyer le problème via

1 votes

Mon problème n'était qu'une faute de frappe, mais cette réponse m'a aidé à le découvrir.

0 votes

J'ai eu la même erreur "native typeface cannot be made" et c'était une faute de frappe. J'essayais d'accéder à la police depuis "/fonts/font.otf" au lieu de "fonts/font.otf".

10voto

mamuso Points 475

Malheureusement, le la police de caractères ne peut être fabriquée L'erreur n'est pas très spécifique, et elle peut être le résultat de beaucoup de choses qui ne vont pas. Il est important de vérifier deux choses :

  • Le premier et le plus important : le fichier est trouvé !
  • La police est valide dans votre appareil.

Le meilleur moyen est de remplacer votre fichier de police par un fichier de police valide connu.
S'il échoue, alors c'est le premier problème.
Si ce n'est pas le cas, c'est le deuxième, donc vous devrez faire face à FontForge ou cherchez une autre police.

9voto

marcieng Points 60

Vérifiez le nom et l'extension de la police. ils sont sensibles à la casse et probablement tout en majuscules. ex.

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

6voto

Michelle Points 571

POUR INFO. La raison de mon crash est une raison quelconque causée par Eclipse. Tout ce que j'ai fait, c'est de nettoyer le projet et de le relancer, puis ça marche.

Tout d'abord, j'ai essayé la police personnalisée dans mon projet de test, que j'utilise pour essayer de nouvelles fonctions, et cela a fonctionné du premier coup. Mais cela n'a pas fonctionné sur le projet sur lequel je travaille jusqu'à ce que je fasse comme ci-dessus.

Essayez donc autant de méthodes que vous le pouvez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X