我的应用中大约有10-15 Activity
或Fragment
个。我有大约5种不同的TypeFaces(大多数Roboto
变体)。
在几乎所有课程中我都必须这样做:
roboto_light = Typeface.createFromAsset(getActivity().getAssets(),
"fonts/roboto_light.ttf");
roboto_thin = Typeface.createFromAsset(getActivity().getAssets(),
"fonts/roboto_thin.ttf");
roboto_regular = Typeface.createFromAsset(getActivity().getAssets(),
"fonts/roboto_regular.ttf");
并非所有课程都使用全部五个。有些使用1,有些使用4,有些使用3,而其他可能使用不同的 3的组合。
在每个类中声明此代码似乎是多余的。 5种字体都可以声明一次,也许当应用程序启动时,然后我使用帮助程序类静态使用它们?
我不确定我是否必须这样做 - 如果可能的话 - 在扩展应用程序的类中,或者只是我可以静态调用的常规类?这会在哪里初始化?
答案 0 :(得分:8)
我不确定我是否必须这样做 - 如果可能的话 - 在课堂上 扩展应用程序,或只是我可以的常规类 静静地打电话?
无论哪种方式都可以。有几个示例实现,它们都“缓存”创建的最后几个类型面。如果我没记错的话,在最近的Android平台上,缓存也会发生。无论如何,基本实现看起来像这样:
public class Typefaces{
private static final Hashtable<String, Typeface> cache = new Hashtable<String, Typeface>();
public static Typeface get(Context c, String name){
synchronized(cache){
if(!cache.containsKey(name)){
Typeface t = Typeface.createFromAsset(c.getAssets(), String.format("fonts/%s.ttf", name));
cache.put(name, t);
}
return cache.get(name);
}
}
}
来源:https://code.google.com/p/android/issues/detail?id=9904#c3
这是使用帮助程序类,但您也可以将其作为自己的Application
扩展名。它会懒惰地创建类型面:它首先尝试从本地缓存中检索类型面,并且只有在缓存中不可用时才实例化一个新面。只需提供Context
和要加载的类型面的名称。
答案 1 :(得分:0)
如果您是使用minApi 24的少数幸运者之一,则您无需执行任何操作,因为createFromAsset()
已启动API Typeface
缓存。如果不是,请参阅@ MH。的答案。