Ich habe eine App, die die Schriftart für einige Elemente ändert. Es funktioniert gut für die meisten Leute, aber vielleicht bekommen 0,5% eine Ausnahme, wenn sie versuchen, die Schriftart zu ändern. Der wesentliche Teil der Stapelverfolgung 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 gesagt, es funktioniert für die meisten Leute, daher denke ich nicht, dass es ein Problem mit der Schriftartdatei oder meinem Code ist. Irgendwelche Vorschläge, wie man das löst?
Bearbeiten: Dies ist mein Code:
Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
"fonts/CharisSILR.ttf");
TextView tv;
tv = ((TextView) findViewById(R.id.searchPronunciationTitle));
tv.setTypeface(phoneticFont);
Antworten:
Dieser Fehler des Android-Betriebssystems könnte der Grund für Ihr Problem sein:
Typeface.createFromAsset leckt den Asset-Stream
Wo gibt es auch eine Problemumgehung in diesem Fehlerbericht:
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); } } }
quelle
Typefaces
zusammen mit der androidsvg- Bibliothek verwende, in der ich mehrere Schriftarten mit der ladeSVGExternalFileResolver
.Ich habe einige der hier gefundenen Lösungen ohne Erfolg verfolgt. Ich dachte, es sei etwas wirklich Dunkles, wie es Programmierer oft tun. Dann könnte ich irgendwo lesen, dass es mit dem Schriftpfad zusammenhängt, gotcha:
Anstatt:
Typeface phoneticFont = Typeface.createFromAsset(getAssets(), "blanch_caps.ttf");
Ich wechselte zu:
Typeface phoneticFont = Typeface.createFromAsset(getAssets(), "fonts/blanch_caps.ttf");
Und meine Datei befindet sich in assets / fonts / blanch_caps.ttf. Nicht, dass es wie ein Zauber wirkt!
quelle
createFromFile
Dieser Fehler trat auf, als sich die Schriftart im Bibliotheks-Asset-Ordner befand. Als ich es in die Assets der Anwendung kopierte, die diese Bibliothek verwendete, verschwand der Fehler.
Es scheint, dass Assets nicht importiert werden können: Der Assets-Ordner der Android Library wird nicht kopiert
Und hier sind einige andere Fälle: Problem bei Verwendung einer benutzerdefinierten Schriftart - "native Schrift kann nicht erstellt werden"
quelle
getAssets()
nicht für die Bibliothek verwenden ... +1 hat für mich funktioniert.Ich hatte viel damit zu kämpfen. Ich habe jede Möglichkeit ausprobiert und nichts hilft. Am Ende war das Problem woanders. Wenn Sie Ihr Projekt mit Gradle erstellen, vergessen Sie nicht, diese Zeilen in die Datei build.gradle einzufügen. Dies löste das Problem in meinem Fall.
sourceSets { main { assets.srcDirs = ['assets'] } }
quelle
build.gradle
, aber ich musste meinen Assets-Ordner direkt unter main (z. B.src\main\assets
)Sie müssen den Assets-Ordner in src -> main in AndroidStudio erstellen . Dieser Weg hat funktioniert!
quelle
In meinem Fall basierte es auf dem Dateinamen der Schriftart. Aus irgendeinem Grund wurde es FontName..ttf genannt
Ich weiß nicht, warum die Doppelpunkte dort waren - ich habe die Originalschrift nachgeschlagen und sie befanden sich in meinem Ordner windows \ fonts als FontName..ttf. Windows war das anscheinend egal, aber Android flippte aus. Ich habe die Datei umbenannt und jetzt ist alles glücklich.
quelle
Für meinen Fall habe ich festgestellt, dass sich der Assets- Ordner in befindet,
/main/java/assets
aber sie müssen sich in befinden/main/assets
quelle
Machen Sie mit Kleinbuchstaben:
Typeface phoneticFont = Typeface.createFromAsset(getAssets(), "fonts/charissilr.ttf");
Denken Sie daran, die Datei auch umzubenennen.
quelle
Typeface phoneticFont = Typeface.createFromAsset(getAssets(), "fonts/CharisSILR.ttf");
Typeface phoneticFont = Typeface.createFromAsset(getAssets(), "CharisSILR.ttf");
quelle
Ich bin gerade auf dieses Problem gestoßen, als ich MagicTextView von qwerjk verwendet habe. Ich habe versucht, die MTV-Klasse in eine Bibliothek zu stellen und in meinem Hauptprojekt zu verwenden. So habe ich es zum Laufen gebracht:
In meinem Hauptprojekt habe ich die MTV-Ansicht von XML aufgeblasen. Stellen Sie sicher, dass MagicTextView auf den richtigen Bibliothekspfad zeigt. Zum Beispiel war meine MTV-Klassenbibliothek com.library.library_magictextview.MagicTextView und daher musste die XML-Datei meiner Hauptansicht lauten:
<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" />
quelle
In unserer Situation hatten wir die Lösung von Hit mit dem Cache verwendet. Das Problem, das wir eingeführt haben, war, dass wir innerhalb desselben try-Blocks auf OTF-Dateien UND TTF-Dateien getestet haben;) Was beim ersten Versuch für OTF offensichtlich fehlschlagen wird, wenn Sie nach einem TTF suchen, aber ich dachte, es lohnt sich, es zu veröffentlichen Nur für den Fall, dass es jemandem nicht auffiel, während er möglicherweise die gleiche Lösung versuchte.
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; }
quelle
In meinem Fall habe ich gerade 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 nur als normaler Ordner, und so funktionierte getAssets () nicht und gab mir den Fehler.
quelle
in android studio: was für mich funktioniert hat ist, die ttf-datei ohne einen unterordner von schriftarten direkt in den vermögensordner zu legen, es hat nicht funktioniert mit dem unterordner ((getAssets (), "fonts / oldengl.ttf") hat nicht funktioniert, wenn Ich hatte die ttf in src / main / assets / fonts). Dies funktioniert: src / main / assets / oldengl.ttf Typeface customfont = Typeface.createFromAsset (getAssets (), "oldengl.ttf");
quelle
Ich bin auf dieses Problem gestoßen, als ich ein Modul importierte, das sowohl Projekte im Eclipse-Stil als auch Projekte im Android Studio-Stil unterstützen sollte.
Ich habe mein Problem behoben, indem ich die Assets aus dem Quellensatz entfernt habe.
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' } } }
Oder das Konvertieren des Projekts in einen Android Studio-Stil kann das Problem auch lösen, denke ich.
quelle
In meinem Fall,
Ich benutze nur den vorherigen Code. Also vergesse ich die Schriftartdatei im Assets-Ordner.
Aber ich kann es 2 Stunden lang nicht herausfinden.
Mögliche Fälle für diesen Fehler,
Zum Beispiel: fonts / roboto.ttf anstelle von fonts / roboto.otf
quelle