web-dev-qa-db-fra.com

"RuntimeException: la police native ne peut pas être créée" lors du chargement de la police

J'essaie d'utiliser une police personnalisée pour une 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 serait la cause de cela? Cela a fonctionné pour les gens dans les blogs, alors pourquoi pas moi? Quelque chose d'important a-t-il changé dans l'API qui m'empêche de le faire?

64
TheLQ

Android ne prend pas en charge OpenType (OTF), uniquement TrueType (TTF), donc votre Molot.otf la police ne fonctionnera probablement pas. J'ai écrit ces deux articles de blog vers lesquels vous liez dans votre phrase d'ouverture (l'un est une copie piratée de l'autre), et ils n'utilisent pas Molot.otf.

(BTW, j'ai quelque peu réparé le formatage de ce post - AndroidGuys ne cesse de changer WordPress hôtes, et donc mes anciens messages sont terriblement cassés en termes de formatage).

MODIFIER : Comme indiqué dans les commentaires, Android FAIT prend désormais en charge OTF.

48
CommonsWare

J'obtiens également la même erreur et j'ai une solution à suivre.

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

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

après l'avoir exécuté.

si vous ne pouvez pas l'exécuter avec succès, vous pouvez envoyer un proplem via

27
phuongnv

Malheureusement, l'erreur ne peut pas être créée n'est pas très spécifique et peut être le résultat de nombreuses erreurs. Il est important de vérifier deux choses:

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

La meilleure façon est de changer votre fichier de police pour un fichier de police valide connu.
S'il échoue, c'est le premier problème.
Sinon, c'est la seconde, vous devrez donc vous occuper de FontForge ou chercher une autre police.

10
mamuso

vérifier le nom et l'extension de la police. il est sensible à la casse et probablement tout en majuscules. par exemple.

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

Pour info. Ma raison de l'accident est une raison causée par Eclipse. Je n'ai fait que nettoyer le projet et recommencer, 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. Cela a fonctionné la toute première fois. 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 possible.

6
Michelle

Android prend en charge les fichiers OTF pour les polices de caractères, si vous êtes confronté à ce problème, assurez-vous que vous définissez le bon chemin pour la police font.put dans les polices de dossier dans le dossier d'actifs et créez la police de caractères comme ci-dessous:

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

@deng sa réponse a fonctionné pour moi ":

vérifier le nom et l'extension de la police. il est sensible à la casse et probablement tout en majuscules. par exemple.

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

Vous devez éditer votre police avec le logiciel "Fontlab" en mod binaire.

4
ali shekari

Android prend en charge les fichiers OTF pour les polices de caractères, si vous rencontrez ce problème, assurez-vous que vous définissez le bon chemin pour la police, par exemple, si vous avez le fichier fontname.otf, placez-le dans un dossier polices dans les actifs dossier et créez la police comme suit:

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

(l'argument du chemin ne doit pas commencer par "/") et le nom de fichier ne doit pas contenir de caractères spéciaux ni de "-" et doit être en minuscules

1
Alaa Eddine Cherbib