我在LayoutInflater上使用Factory接口,可以在我的应用程序中的所有TextView上设置自定义字体。不幸的是,我的应用程序中有些地方不起作用。在调查之后,似乎在我的ListView的适配器中,例如,用于给单元膨胀的LayoutInflater与用于其他应用程序的那个不同(我的活动具有与Fragments的复杂结构)。
这种行为是正常的吗?我怎样才能确保始终使用相同的LayoutInflater,无论我以何种方式检索它?
由于
答案 0 :(得分:1)
当你从LayoutInflater
(Context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)
和ViewGroup.inflate
引用Activity.getLayoutInflater
只是方便的包装器时,我认为它总是返回对同一个inflater服务的引用,直到它被销毁并重新创建,然后返回这个新创建的,依此类推......我假设从getSystemService方法获取的manager对象就像“普通”服务的binder对象一样。
编辑: 并说上面我错了;)
我检查了源代码和android.view.ContextThemeWrapper(这是activitie的超类):
@Override public Object getSystemService(String name) {
if (LAYOUT_INFLATER_SERVICE.equals(name)) {
if (mInflater == null) {
mInflater = LayoutInflater.from(mBase).cloneInContext(this);
}
return mInflater;
}
return mBase.getSystemService(name);
}
并且在android.app.ContextImpl中可能是mBase上下文实现:
public Object getSystemService(String name) {
ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);
return fetcher == null ? null : fetcher.getService(this);
}
其中: private static final HashMap SYSTEM_SERVICE_MAP = 新的HashMap();
和ServiceFetcher是一个用于缓存和检索“系统服务实例”的内部类。
每个活动/ ContextWrapper确实有一个LayoutInflater。有关更多观察研究资料,请;)
答案 1 :(得分:0)
我不认为LayoutInflaters的数量真的很重要(除非你真的数千)。但是,是的,使用多个Inflaters确实很正常。在使用我的适配器视图时,我使用了很多(因为我没有使用一个静态视图。每个适配器仍然只使用一个)。
如果您的代码中有适配器无法正常工作的地方,您可能会遗漏某些内容。我会将代码发布在Inflater无法工作的地方。