“El tipo de letra nativo no se puede hacer” solo para algunas personas

Tengo una aplicación que cambia la fuente tipográfica para algunos elementos. Funciona bien para la mayoría de las personas, pero tal vez un 0.5% obtenga una excepción cuando intente cambiar la fuente. La parte importante del seguimiento de la stack es esta:

Caused by: java.lang.RuntimeException: native typeface cannot be made at android.graphics.Typeface.(Typeface.java:147) at android.graphics.Typeface.createFromAsset(Typeface.java:121) 

Como digo, funciona para la mayoría de las personas, por lo que no creo que sea un problema con el archivo de fuente o mi código. ¿Alguna sugerencia sobre cómo solucionar esto?

Editar: Este es mi código:

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

Este error del SO Android podría ser el motivo de tu problema:

Typeface.createFromAsset filtra la stream de activos

Donde también hay una solución en este informe de error:

Modifiqué la solución temporal de HTH para que el método no asumiera la ruta o el formato de la fuente. La ruta completa del elemento fuente debe enviarse como un parámetro. También completé la llamada a createFromAsset () en un bloque try-catch para que el método get () devuelva null si no se encuentra el activo.

 public class Typefaces { private static final String TAG = "Typefaces"; private static final Hashtable cache = new Hashtable(); 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); } } } 

Seguí algunas de las soluciones que se encuentran aquí, sin éxito. Pensé que era algo realmente oscuro, como a menudo lo hacen los progtwigdores. Entonces, en algún lugar que leí, podría estar relacionado con la ruta de la fuente, gotcha:

En lugar de:

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

Cambié a:

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

Y mi archivo está en assets / fonts / blanch_caps.ttf. ¡No funciona como un encanto!

Este error surgió cuando la fuente estaba en la carpeta de activos de la biblioteca. Cuando lo copié en los activos de la aplicación que estaba usando esta biblioteca, el error desapareció.

Parece que los activos no se pueden importar: la carpeta de activos de la biblioteca Android no se copia

Y aquí hay algunos otros casos: Problema al usar una fuente personalizada: “no se puede hacer el tipo de letra nativo”

Estaba luchando con esto mucho. Intenté todas las posibilidades y nada me ayudó. Al final, el problema estaba en otro lado. Si está construyendo su proyecto con Gradle, no olvide agregar estas líneas en el archivo build.gradle. Esto resolvió el problema en mi caso.

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

Debe crear una carpeta de recursos dentro de src -> main en AndroidStudio. ¡De esta manera funcionó!

En mi caso, estaba basado en el nombre de archivo de la fuente. Por alguna razón, se llamaba FontName..ttf

No sé por qué los puntos dobles estaban allí – busqué la fuente original y estaban en mi carpeta windows \ fonts como FontName..ttf. Windows aparentemente no le importaba, pero Android se asustó. Cambié el nombre del archivo y ahora todo está feliz.

Para mi caso, he encontrado que la carpeta de activos se encuentra en /main/java/assets pero deben estar en /main/assets

Hacer con minúsculas:

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

Recuerde también cambiar el nombre del archivo.

Cambia esto

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

a

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

Me encontré con este problema cuando estaba usando MagicTextView de qwerjk. Traté de poner la clase de MTV en una biblioteca y usarla en mi proyecto principal. Así es como lo hice funcionar:

  1. En la carpeta de activos principales del proyecto, cree una subcarpeta llamada fonts
  2. Copie el archivo ttf en la carpeta assets / fonts. Mi nombre de archivo era camelcase (por ejemplo, ReservoirGrunge.ttf) y, por lo tanto, las mayúsculas o las mayúsculas no parecen importar.
  3. En mi proyecto principal inflé la vista de MTV desde xml. Asegúrese de que MagicTextView apunta a la ruta correcta de la biblioteca. Por ejemplo, mi biblioteca de clase de MTV era com.library.library_magictextview.MagicTextView y, por lo tanto, el xml de mi vista principal tenía que leer:

       

En nuestra situación, habíamos empleado la solución de Hit con el caché. El problema que presentamos fue que estábamos probando archivos OTF Y archivos TTF dentro del mismo bloque try;) que obviamente va a fallar en el primer bash de OTF si está buscando obtener un TTF, pero pensé que valía la pena publicarlo SOLO en caso de que se le escapara, pasó la notificación de alguien mientras intentaban la misma solución.

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

En mi caso, simplemente eliminé la carpeta de activos (que creé manualmente) y acabo de crear una nueva usando el asistente. Aparentemente no se leyó como la carpeta de activos, sino que se leyó como una carpeta normal, por lo que getAssets () no funcionó y me dio el error.

en android studio: lo que funcionó para mí es poner el archivo ttf directamente en la carpeta assets sin una subcarpeta de fonts, no funcionó con la subcarpeta ((getAssets (), “fonts / oldengl.ttf”) no funcionó cuando tuve el ttf en src / main / assets / fonts). esto funciona: src / main / assets / oldengl.ttf Typeface customfont = Typeface.createFromAsset (getAssets (), “oldengl.ttf”);

Me encontré con este problema cuando importé un módulo que estaba destinado a admitir tanto proyectos de eclipse como proyectos de estilo de estudio de Android.

Resolví mi problema eliminando los activos del conjunto fuente como-

 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' } } } 

O convertir el proyecto en un estilo de estudio de Android también puede resolver el problema, supongo.

En mi caso,

Solo uso el código anterior … Así que me olvido del archivo de fonts en la carpeta de activos …

Pero no puedo entender por 2 horas …

Posibles casos para este error,

  1. Falta el archivo de fuente
  2. Nombre de fuente incorrecto o extensión de fuente incorrecta

por ej .: fonts / roboto.ttf en lugar de fonts / roboto.otf