Pregunta "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 pila es esta:

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)

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

73
2017-10-07 07:26


origen


Respuestas:


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

Typeface.createFromAsset filtra la corriente de activos

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

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

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
2017-10-26 12:43



Seguí algunas de las soluciones que se encuentran aquí, sin éxito. Pensé que era algo realmente oscuro, como a menudo lo hacen los programadores. 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!


52
2017-07-20 20:35



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 cuando se usa una fuente personalizada: "no se puede hacer la tipografía nativa"


50
2018-01-05 09:47



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

25
2017-08-11 10:19



Debes crear una carpeta de activos dentro src->principal en AndroidStudio. ¡De esta manera funcionó!


7
2017-11-18 07:43



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.


4
2018-01-29 13:36



Para mi caso, he encontrado que bienes carpeta ubicada en /main/java/assets pero deben estar en /main/assets


4
2017-08-15 14:10



Hacer con minúsculas:

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

Recuerde también cambiar el nombre del archivo.


2
2017-12-05 06:42



Cambia esto

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

a

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

1
2018-02-13 11:38