关于android:一个应用中实例化了多少个LayoutInflater?

How many LayoutInflater are instantiated in an application?

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

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

谢谢


当您从 Context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) 获得对 LayoutInflater 的引用时(ViewGroup.inflateActivity.getLayoutInflater 只是方便的package器),我认为它总是返回对相同充气服务的引用,直到它被销毁并重新创建,然后这个返回新创建的,依此类推...我认为从 getSystemService 方法获取的管理器对象类似于"普通"服务的活页夹对象。

编辑:
上面说我错了;)

我查看了源代码并在 android.view.ContextThemeWrapper(这是 activiti 的超类)中:

1
2
3
4
5
6
7
8
9
 @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 上下文实现:

1
2
3
4
public Object getSystemService(String name) {
    ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);
    return fetcher == null ? null : fetcher.getService(this);
}

在哪里:
私有静态最终HashMap SYSTEM_SERVICE_MAP =
新的 HashMap();

ServiceFetcher 是一个用于缓存和检索"系统服务实例"的内部类。

确定每个活动/ContextWrapper 都有一个 LayoutInflater。如需更多观察研究来源,请;)


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

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