我在 LayoutInflater 上使用 Factory 界面,以便能够在我的应用程序中的所有 TextView 上设置自定义字体。不幸的是,我的应用程序中有一些地方不起作用。经过调查,例如,在我的 ListView 的适配器中,用于填充单元格的 LayoutInflater 似乎与应用程序其余部分使用的不同(我的活动具有复杂的片段结构)。
这种行为正常吗?如何确保始终使用相同的 LayoutInflater,无论我以何种方式检索它?
谢谢
我在 LayoutInflater 上使用 Factory 界面,以便能够在我的应用程序中的所有 TextView 上设置自定义字体。不幸的是,我的应用程序中有一些地方不起作用。经过调查,例如,在我的 ListView 的适配器中,用于填充单元格的 LayoutInflater 似乎与应用程序其余部分使用的不同(我的活动具有复杂的片段结构)。
这种行为正常吗?如何确保始终使用相同的 LayoutInflater,无论我以何种方式检索它?
谢谢
当你LayoutInflater
从Context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)
(ViewGroup.inflate
并且Activity.getLayoutInflater
只是方便的包装器)获得引用时,我认为它总是返回对同一个充气器服务的引用,直到它被销毁并重新创建,然后这个新创建的被返回,等等......我认为那个经理从 getSystemService 方法获取的对象类似于“普通”服务的绑定对象。
编辑:上面说我错了;)
我检查了源代码和 android.view.ContextThemeWrapper (这是活动的超类):
@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 Context 实现:
public Object getSystemService(String name) {
ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);
return fetcher == null ? null : fetcher.getService(this);
}
其中:私有静态最终HashMap SYSTEM_SERVICE_MAP = new HashMap();
ServiceFetcher 是一个用于缓存和检索“系统服务实例”的内部类。
可以肯定的是,每个活动/ContextWrapper 都有一个 LayoutInflater。有关更多观察研究来源,请;)
我不认为 LayoutInflaters 的数量真的很重要(除非你真的有数千个)。但是,是的,使用多个 Inflaters 确实是正常的。我在使用适配器视图时使用了很多(因为我不使用一个静态视图。每个适配器仍然只使用一个)。
如果您的代码中有适配器不起作用的地方,您可能会遗漏一些东西。我会在 Inflater 不起作用的地方发布代码。