Android Galaxy Tab Runtimeexception:无法制作原生字体?

时间:2011-04-15 05:53:45

标签: android typeface galaxy-tab

我正在尝试使用自定义字体 它可以在模拟器上运行,没有任何问题。

但是在三星Galaxy Tab上引发了以下错误: 原生字体无法制作

这是我的代码:

               public static Typeface typeface;
             // -----define typeface

    typeface = Typeface.createFromAsset(getAssets(), "fonts/Verdana.TTf");
    Typeface.class.getField("DEFAULT").setAccessible(true);
                          ---------------------
        lblBrandCategory1.setTypeface(GuestActivity.typeface, 4);


            anyone knows the solution???

2 个答案:

答案 0 :(得分:2)

我有这个(在Galaxy Tab上发生)正在做你正在做的事情。结果是对我来说是一个区分大小写的问题,例如: filename全部小写,我在java代码中大写.ttf文件名。

所以大概这意味着只要找不到ttf就会出现这个错误(所以检查你的路径也是好的。)

答案 1 :(得分:0)

我有同样的问题,我不相信它依赖于设备。

我通过确定以下内容解决了这个问题:

  1. 如果您有多个项目,请确保您的字体文件存储在主项目的资产文件夹中 - 而不是依赖项目。

  2. 为了安全起见,将字体重命名为全部小写,并在代码中将其引用。

    FontUtils.setDefaultFont(this, "DEFAULT", "fonts/arimo-regular.ttf");

  3. 这是一个覆盖整个应用程序默认字体的类。

    public class FontUtils {
    
    /**
     * Sets the default font.
     *
     * @param context the context
     * @param staticTypefaceFieldName the static typeface field name
     * @param fontAssetName the font asset name
     */
    public static void setDefaultFont(Context context,
            String staticTypefaceFieldName, String fontAssetName) {
        final Typeface regular = Typefaces.get(context, fontAssetName);
        replaceFont(staticTypefaceFieldName, regular);
    }
    
    /**
     * Replace a font.
     *
     * @param staticTypefaceFieldName the static typeface field name
     * @param newTypeface the new typeface
     */
    protected static void replaceFont(String staticTypefaceFieldName,
            final Typeface newTypeface) {
        try {
            final Field StaticField = Typeface.class
                    .getDeclaredField(staticTypefaceFieldName);
            StaticField.setAccessible(true);
            StaticField.set(null, newTypeface);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
    
    static class 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) {
                        System.out.println("Could not get typeface '" + assetPath + "' because " + e.getMessage());
                        return null;
                    }
                }
                return cache.get(assetPath);
            }
        }
    }
    }