在应用程序中实例化了多少个LayoutInflater?

时间:2012-06-04 21:39:14

标签: android layout-inflater

我在LayoutInflater上使用Factory接口,可以在我的应用程序中的所有TextView上设置自定义字体。不幸的是,我的应用程序中有些地方不起作用。在调查之后,似乎在我的ListView的适配器中,例如,用于给单元膨胀的LayoutInflater与用于其他应用程序的那个不同(我的活动具有与Fragments的复杂结构)。

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

由于

2 个答案:

答案 0 :(得分:1)

当你从LayoutInflaterContext.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无法工作的地方。