我正在尝试使用自定义字体 它可以在模拟器上运行,没有任何问题。
但是在三星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???
答案 0 :(得分:2)
我有这个(在Galaxy Tab上发生)正在做你正在做的事情。结果是对我来说是一个区分大小写的问题,例如: filename全部小写,我在java代码中大写.ttf文件名。
所以大概这意味着只要找不到ttf就会出现这个错误(所以检查你的路径也是好的。)
答案 1 :(得分:0)
我有同样的问题,我不相信它依赖于设备。
我通过确定以下内容解决了这个问题:
如果您有多个项目,请确保您的字体文件存储在主项目的资产文件夹中 - 而不是依赖项目。
为了安全起见,将字体重命名为全部小写,并在代码中将其引用。
FontUtils.setDefaultFont(this, "DEFAULT", "fonts/arimo-regular.ttf");
这是一个覆盖整个应用程序默认字体的类。
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);
}
}
}
}