“只能为某些人制作”原生字体“

时间:2012-10-07 07:26:46

标签: android fonts typeface

我有一个应用程序可以更改某些元素的字体字体。它适用于大多数人,但在尝试更改字体时可能会有0.5%的异常。堆栈跟踪的重要部分是:

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)

正如我所说,它适用于大多数人,所以我认为这不是字体文件或我的代码的问题。关于如何解决这个问题的任何建议?

修改:这是我的代码:

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

15 个答案:

答案 0 :(得分:68)

Android OS的这个错误可能是您遇到问题的原因:

Typeface.createFromAsset leaks asset stream

此错误报告中的解决方法也在哪里:

  

我改变了HTH的解决方法,以便该方法不承担字体   路径或格式。字体资产的完整路径必须提交为   一个参数。我还将调用createFromAsset()包装在一个   try-catch块,以便get()方法在资产时返回null   找不到。

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

答案 1 :(得分:52)

我按照这里找到的一些解决方案,没有成功。我认为这是一个非常模糊的东西,正如程序员经常做的那样。然后我读到的某个地方可能与字体路径有关,得到了:

而不是:

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

我改为:

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

我的文件位于assets / fonts / blanch_caps.ttf中。它不像魅力!

答案 2 :(得分:50)

当字体位于库资源文件夹中时出现此错误。当我将其复制到使用此库的应用程序的资产时,错误消失了。

似乎资产无法导入: Android Library assets folder doesn't get copied

以下是其他一些案例:Issue when using a custom font - "native typeface cannot be made"

答案 3 :(得分:25)

我正在努力解决这个问题。我尝试了所有可能性,没有任何帮助最后,问题出在其他地方。如果使用Gradle构建项目,请不要忘记在build.gradle文件中添加这些行。这解决了我的问题。

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

答案 4 :(得分:7)

您必须在AndroidStudio中的 src - &gt; main 中创建资源文件夹。这种方式有效!

答案 5 :(得分:4)

就我而言,它基于字体的文件名。出于某种原因,它被命名为FontName..ttf

我不知道为什么双点在那里 - 我查找了原始字体,它们在我的windows \ fonts文件夹中作为FontName..ttf。 Windows显然并不关心,但Android吓坏了。我重命名了这个文件,现在都很高兴。

答案 6 :(得分:4)

对于我的情况,我发现资产文件夹位于/main/java/assets,但它们必须位于/main/assets

答案 7 :(得分:2)

小写:

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

请记住也要重命名该文件。

答案 8 :(得分:1)

  

更改此

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

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

答案 9 :(得分:0)

当我使用qwerjk的MagicTextView时,我遇到了这个问题。我试图将MTV类放在库中,并在我的主项目中使用它。以下是我如何使用它:

  1. 在主项目资源文件夹中,创建一个名为fonts
  2. 的子文件夹
  3. 将ttf文件复制到assets / fonts文件夹中。我的文件名是camelcase(例如ReservoirGrunge.ttf),所以大写或没有大写似乎并不重要。
  4. 在我的主项目中,我从xml中夸大了MTV视图。确保MagicTextView指向正确的库路径。例如,我的MTV类库是com.library.library_magictextview.MagicTextView,因此我的主视图的xml必须阅读:

        <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" />
    

答案 10 :(得分:0)

在我们的情况下,我们使用了Hit的解决方案和缓存。我们引入的问题是我们在同一个try块中测试了OTF文件和TTF文件;)如果你想获得一个TTF,那么第一次尝试OTF显然会失败,但我认为值得发帖只是在他们可能正在尝试相同的解决方案时,它通过了某人的通知。

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

答案 11 :(得分:0)

在我的情况下,我刚删除了资产文件夹(我手动创建),并使用向导创建了一个新文件夹。显然它不是作为资源文件夹读取,而是只读取普通文件夹,因此getAssets()不起作用并给我错误。

答案 12 :(得分:0)

在android studio中:对我有用的是将ttf文件直接放到assets文件夹而没有字体的子文件夹,它没有使用子文件夹((getAssets(),&#34; fonts / oldengl。 ttf&#34;)当我在src / main / assets / fonts中使用ttf时没有工作。 这工作: 的src / main /资产/ oldengl.ttf 字体customfont = Typeface.createFromAsset(getAssets(),&#34; oldengl.ttf&#34;);

答案 13 :(得分:0)

当我导入一个旨在支持eclipse样式项目和android studio样式项目的模块时,我遇到了这个问题。

我通过从源集中删除资产 -

来解决我的问题
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'
            }
        }
    }

或者将项目转换为android studio风格也可以解决我猜的问题。

答案 14 :(得分:0)

就我而言,

我只是使用前面的代码..所以我忘记了资源文件夹中的字体文件..

但我不能弄清楚2个小时..

此错误的可能情况,

  
      
  1. 缺少字体文件
  2.   
  3. 错误的字体名称或错误的字体扩展名
  4.   

例如: fonts / roboto.ttf 而不是 fonts / roboto.otf