4

我的代码中有一个巨大的问题,其中我assets\fonts\从自定义TextView类中加载我的文件夹中的字体。第一个问题是它在 4.0 设备上崩溃,但除外Caused by: java.lang.RuntimeException: native typeface cannot be made。我在这里使用与该方法相同的过程:

public class MyTextView extends TextView {

      public MyTextView(Context context, AttributeSet attrs, int defStyle) {
          super(context, attrs, defStyle);
      }

     public MyTextView(Context context, AttributeSet attrs) {
          super(context, attrs);
      }

     public MyTextView(Context context) {
          super(context);
     }


    public void setTypeface(Typeface tf, int style) {
        if (style == Typeface.BOLD) {
            super.setTypeface(Typeface.createFromAsset(
                    getContext().getAssets(), "fonts/hirakakupronbold.ttf"));
        } else if (style == Typeface.ITALIC) {
            super.setTypeface(Typeface.createFromAsset(
                    getContext().getAssets(), "fonts/hirakakupronitalic.ttf"));
        } else {
            super.setTypeface(Typeface.createFromAsset(
                    getContext().getAssets(), "fonts/hirakakupron.ttf"));
        }
    }
}

请注意,我正在使用扩展名.ttf,我发现这是导致RunTimeException. 所以我用扩展名转换了各自的字体,现在它已经在 4.0 设备上运行了,但是这里.otf有内存泄漏。这里有解决方法,但我不知道如何使用/调用它。任何帮助都可以,谢谢。

4

4 回答 4

8

好的,所以我最终认为TypeFace在类中实例化一个对象TextView会在每次实例化相同的对象时造成如此多的负载TextView。这导致我的应用程序滞后并OutOfMemoryException最终导致。所以我所做的是创建一个不同的自定义TypeFace类,它会从资产中调用我的字体,以便它从TypeFace类而不是类中实例化TextView

这是我的 TypeFaces 类:

public class TypeFaces {

    private static final Hashtable<String, Typeface> cache = new Hashtable<String, Typeface>();

    public static Typeface getTypeFace(Context context, String assetPath) {
        synchronized (cache) {
            if (!cache.containsKey(assetPath)) {
                try {
                    Typeface typeFace = Typeface.createFromAsset(
                            context.getAssets(), assetPath);
                    cache.put(assetPath, typeFace);
                } catch (Exception e) {
                    Log.e("TypeFaces", "Typeface not loaded.");
                    return null;
                }
            }
            return cache.get(assetPath);
        }
    }
}

和自定义 TextView 类:

public class TextViewHirakaku extends TextView {

    public TextViewHirakaku(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public TextViewHirakaku(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public TextViewHirakaku(Context context) {
        super(context);
    }

    public void setTypeface(Typeface tf, int style) {
        if (style == Typeface.BOLD) {
            super.setTypeface(TypeFaces.getTypeFace(getContext(),
                    "fonts/hirakakupronbold.ttf"));
        } else if (style == Typeface.ITALIC) {
            super.setTypeface(TypeFaces.getTypeFace(getContext(),
                    "fonts/hirakakupronitalic.ttf"));
        } else {
            super.setTypeface(TypeFaces.getTypeFace(getContext(),
                    "fonts/hirakakupron.ttf"));
        }
    }
}

请注意,我现在在这里从类中调用getTypeFace方法。TypeFaces

于 2014-01-28T01:37:06.523 回答
7

如果您在 Android Studio 上遇到此问题,请将您的资产放在主目录下,而不是将其放在 res 目录下。

同样在字体命名中仅使用小写字母和下划线,例如 my_font.ttf

这对我来说就像魅力一样

于 2014-10-07T07:36:06.950 回答
1

如果您从 xml 扩展此视图,请尝试以这种方式使用它::

public class MyTextView extends TextView {

  public MyTextView(Context context, AttributeSet attrs, int defStyle) {
      super(context, attrs, defStyle);
      init();
  }

 public MyTextView(Context context, AttributeSet attrs) {
      super(context, attrs);
      init();
  }

 public MyTextView(Context context) {
      super(context);
      init();
 }


public void init() {
    Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "fonts/hirakakupronbold.ttf");
    setTypeface(tf);

}

}

它对我来说工作正常。为每种字体样式创建单独的类扩展 TextView。要应用它,请将“TextView”替换为“com.yourpackage.MyTextView”

问候,

于 2014-01-06T04:07:05.007 回答
0

就我而言,我用于自定义视图(服装)的 XML 命名空间前缀设置不正确:

xmlns:costum="http://schemas.android.com/apk/tools"

我所要做的就是将其更改为

xmlns:costum="http://schemas.android.com/apk/res-auto"

& 有效。

于 2016-06-04T19:08:03.587 回答