it-swarm.com.de

"Native Schrift kann nicht nur für einige Leute gemacht werden"

Ich habe eine App, die die Schriftart für einige Elemente ändert. Für die meisten Leute funktioniert es gut, aber vielleicht bekommen 0,5% eine Ausnahme, wenn Sie versuchen, die Schriftart zu ändern. Der wesentliche Teil der Stack-Ablaufverfolgung ist folgender:

Caused by: Java.lang.RuntimeException: native typeface cannot be made
at Android.graphics.Typeface.<init>(Typeface.Java:147)
at Android.graphics.Typeface.createFromAsset(Typeface.Java:121)

Wie ich schon sagte, es funktioniert für die meisten Leute, daher glaube ich nicht, dass es ein Problem mit der Schriftdatei oder meinem Code ist. Anregungen zur Lösung dieses Problems?

Bearbeiten: Dies ist mein Code:

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                                 "fonts/CharisSILR.ttf");
TextView tv;
tv = ((TextView) findViewById(R.id.searchPronunciationTitle));
tv.setTypeface(phoneticFont);
74
user936580

Dieser Fehler des Android-Betriebssystems könnte der Grund für Ihr Problem sein:

Typeface.createFromAsset verliert Asset-Stream

Wo gibt es auch einen Workaround in diesem Bugreport:

Ich habe die Problemumgehung von HTH geändert, sodass die Methode nicht die Schriftart .__ annimmt. Pfad oder Format. Der vollständige Pfad des Font-Assets muss als .__ übergeben werden. ein Parameter. Ich habe den Aufruf von createFromAsset () auch in eine .__-Datei geschrieben. try-catch-Block, so dass die get () -Methode null zurückgibt, wenn das Asset wurde nicht gefunden.

public class Typefaces {
    private static final String TAG = "Typefaces";

    private static final Hashtable<String, Typeface> cache = new Hashtable<String, Typeface>();

    public static Typeface get(Context c, String assetPath) {
        synchronized (cache) {
            if (!cache.containsKey(assetPath)) {
                try {
                    Typeface t = Typeface.createFromAsset(c.getAssets(),
                            assetPath);
                    cache.put(assetPath, t);
                } catch (Exception e) {
                    Log.e(TAG, "Could not get typeface '" + assetPath
                            + "' because " + e.getMessage());
                    return null;
                }
            }
            return cache.get(assetPath);
        }
    }
}
68
HitOdessit

Ich habe einige der hier gefundenen Lösungen verfolgt, ohne Erfolg. Ich dachte, es sei etwas wirklich Unbekanntes, wie Programmierer es oft tun. Dann habe ich irgendwo gelesen, dass es mit dem Schriftpfad zu tun haben könnte, gotcha:

Anstatt:

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                             "blanch_caps.ttf");   

Ich habe gewechselt zu:

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                             "fonts/blanch_caps.ttf");   

Und meine Datei befindet sich in assets/fonts/blanch_caps.ttf. Nicht funktioniert es wie ein Zauber!

52
joao_dv

Dieser Fehler trat auf, wenn sich die Schriftart im Bibliotheksbestandsordner befand. Als ich es in Assets der Anwendung kopierte, die diese Bibliothek verwendete, verschwand der Fehler.

Es scheint, dass Assets nicht importiert werden können: Der Asset-Ordner von Android Library wird nicht kopiert

Und hier sind einige andere Fälle: Problem bei Verwendung einer benutzerdefinierten Schriftart - "native Schrift kann nicht erstellt werden"

50
Lumis

Ich hatte viel damit zu kämpfen. Ich habe jede Möglichkeit ausprobiert und nichts hilft. Am Ende war das Problem woanders. Wenn Sie ein Projekt mit Gradle erstellen, vergessen Sie nicht, diese Zeilen in der Datei build.gradle hinzuzufügen. Dies löste das Problem in meinem Fall.

    sourceSets {
    main {
        assets.srcDirs = ['assets']
    }
}
25
Michal

Sie müssen den Assets-Ordner in src -> main in Android Studio erstellen. Dieser Weg hat funktioniert!

7
Madi

Für meinen Fall habe ich herausgefunden, dass sich der Ordner assets in /main/Java/assets befindet, aber sie müssen in /main/assets

4
Chulo

In meinem Fall basierte es auf dem Dateinamen der Schrift. Aus irgendeinem Grund wurde es FontName..ttf genannt

Ich weiß nicht, warum die doppelten Punkte vorhanden waren. Ich habe die ursprüngliche Schriftart nachgeschlagen und sie befand sich in meinem Windows\fonts-Ordner als FontName..ttf. Anscheinend war Windows egal, aber Android flippte aus. Ich habe die Datei umbenannt, und jetzt ist alles glücklich.

4
Tab

Mit Kleinschreibung:

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                             "fonts/charissilr.ttf");

Denken Sie daran, auch die Datei umzubenennen.

2
Pedro HCDO

Ändern Sie diese

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                             "fonts/CharisSILR.ttf");

zu

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                             "CharisSILR.ttf");
1
Kadir altınok

In unserer Situation hatten wir die Lösung von Hit mit dem Cache verwendet. Das Problem, das wir einführten, war, dass wir OTF-Dateien UND TTF-Dateien innerhalb desselben try-Blocks testeten;) Was beim ersten Versuch für OTF offensichtlich fehlschlagen wird, wenn Sie nach einer TTF suchen, aber ich dachte, es wäre eine Veröffentlichung wert JUST, falls der Fehler jemandem aufgefallen ist, obwohl er möglicherweise dieselbe Lösung versucht.

protected static Typeface getTypeface(Context p_context, String p_fontName){
    Typeface tf = null;
    try {
        tf = Typeface.createFromAsset(p_context.getAssets(), "fonts/" + p_fontName + ".otf");
    }catch(Exception e) {}

    if( tf != null ) return tf;

    try {
        tf = Typeface.createFromAsset(p_context.getAssets(), "fonts/" + p_fontName + ".ttf");
    }catch(Exception e) {}

    return tf;
}
0
neoRiley

In meinem Fall habe ich nur den Assets-Ordner (den ich manuell erstellt habe) gelöscht und mit dem Assistenten einen neuen erstellt. Anscheinend wurde es nicht als Assets-Ordner gelesen, sondern als normaler Ordner. Daher funktionierte getAssets () nicht und gab mir den Fehler.

0
omarwaleed

In meinem Fall,

Ich verwende einfach den vorherigen Code .. Also vergesse ich die Schriftdatei im Assets Ordner.

Aber ich kann nicht für 2 Stunden herausfinden .. 

Mögliche Fälle für diesen Fehler

  1. Schriftartdatei fehlt
  2. Falscher Schriftname oder falsche Schrifterweiterung

zB: fonts/roboto.ttf anstelle von fonts/roboto.otf

0
Ranjith Kumar

Ich wurde in dieses Problem gerannt, als ich ein Modul importierte, das sowohl Eclipse-Style-Projekte als auch Android-Studio-Style-Projekte unterstützen sollte.

Ich habe mein Problem gelöst, indem ich die Assets aus der Quellgruppe entfernte.

defaultConfig {
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName '1.0'

        sourceSets {
            main {
                Java.srcDirs = ['src']
                res.srcDirs = ['res']
                //assets.srcDirs = ['assets']//commented this out because modlue was not having this directory
                manifest.srcFile 'AndroidManifest.xml'
            }
        }
    }

Wenn Sie das Projekt in einen Android-Studio-Stil konvertieren, kann das Problem auch gelöst werden.

0
Sanjeet A

in Android Studio: Was für mich funktioniert hat, ist die ttf-Datei direkt in den Assets-Ordner ohne Unterordner von Schriftarten zu setzen. Es funktionierte nicht mit dem Unterordner ((getAssets (), "fonts/oldengl.ttf") funktionierte nicht ich hatte das ttf in src/main/assets/fonts) ... __ das funktioniert: src/main/assets/oldengl.ttf .__ ");

0
Stas Krantsov

Ich bin gerade auf dieses Problem gestoßen, als ich MagicTextView von qwerjk verwendete. Ich habe versucht, die MTV-Klasse in eine Bibliothek aufzunehmen und in meinem Hauptprojekt zu verwenden. So habe ich es zum Laufen gebracht:

  1. Erstellen Sie im Hauptordner der Projektobjekte einen Unterordner mit dem Namen "Schriftarten"
  2. Kopieren Sie die TTF-Datei in den Ordner "assets/fonts". Mein Dateiname war camelcase (z. B. "ReservoirGrunge.ttf"), und so scheinen Caps oder keine Caps keine Rolle zu spielen.
  3. In meinem Hauptprojekt habe ich die MTV-Ansicht von XML aus aufgeblasen. Stellen Sie sicher, dass MagicTextView auf den richtigen Bibliothekspfad zeigt. Zum Beispiel war meine MTV-Klassenbibliothek com.library.library_magictextview.MagicTextView. Daher musste der XML-Code meiner Hauptansicht Folgendes lesen:

        <com.library.library_magictextview.MagicTextView
        Android:textSize=           "50dp"
        Android:textColor=          "#ffffffff"
        Android:layout_width=       "fill_parent"
        Android:layout_height=      "wrap_content"
    
        Android:textStyle=          "bold"
        Android:padding=            "20dp"
        Android:gravity=            "center"
    
        r:strokeColor=          "#FFff0000"
        r:strokeJoinStyle=      "miter"
        r:strokeWidth=          "5"
        r:typeface=         "ReservoirGrunge"
        Android:text=               "BobDillon" />
    
0
Chris Sprague