1

我在 LayoutInflater 上使用 Factory 界面,以便能够在我的应用程序中的所有 TextView 上设置自定义字体。不幸的是,我的应用程序中有一些地方不起作用。经过调查,例如,在我的 ListView 的适配器中,用于填充单元格的 LayoutInflater 似乎与应用程序其余部分使用的不同(我的活动具有复杂的片段结构)。

这种行为正常吗?如何确保始终使用相同的 LayoutInflater,无论我以何种方式检索它?

谢谢

4

2 回答 2

1

当你LayoutInflaterContext.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。有关更多观察研究来源,请;)

于 2012-06-04T22:06:28.733 回答
0

我不认为 LayoutInflaters 的数量真的很重要(除非你真的有数千个)。但是,是的,使用多个 Inflaters 确实是正常的。我在使用适配器视图时使用了很多(因为我不使用一个静态视图。每个适配器仍然只使用一个)。

如果您的代码中有适配器不起作用的地方,您可能会遗漏一些东西。我会在 Inflater 不起作用的地方发布代码。

于 2012-06-04T21:52:05.163 回答