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);
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);
}
}
}
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!
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"
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']
}
}
Sie müssen den Assets-Ordner in src -> main in Android Studio erstellen. Dieser Weg hat funktioniert!
Für meinen Fall habe ich herausgefunden, dass sich der Ordner assets in /main/Java/assets
befindet, aber sie müssen in /main/assets
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.
Mit Kleinschreibung:
Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
"fonts/charissilr.ttf");
Denken Sie daran, auch die Datei umzubenennen.
Ändern Sie diese
Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
"fonts/CharisSILR.ttf");
zu
Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
"CharisSILR.ttf");
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;
}
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.
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
- Schriftartdatei fehlt
- Falscher Schriftname oder falsche Schrifterweiterung
zB: fonts/roboto.ttf anstelle von fonts/roboto.otf
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.
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 .__ ");
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:
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" />