2016-09-21 53 views
4

我有时会将Dagger的链接注入LayoutInflater,并从应用程序上下文中生成它,如下所示:LayoutInflater.from(application);。它减少了代码行。inflater是否需要Activity的上下文?

但学校告诉我,这是错误的方式,它具有由LayoutInflater.from(MainActivity.this);

是真的从活动方面给予?布局充气器的行为是否取决于上下文的类型?

回答

0

如果您知道自己需要上下文来获取可能比您可以使用的任何其他可能上下文更长的内容(如services),则可以使用getApplicationContext()

因此,当您不需要长时间或全球范围的对象时,最好使用activity context

希望它会有所帮助。

+0

是的,谢谢。但问题是关于LayoutInflater。如果使用从应用程序上下文生成的LayoutInflater,我会看UI中的任何区别吗? – tse

+0

不,你不会。所以使用活动上下文来改善内存管理。 – KDeogharkar

1

如果我理解正确,在使用应用程序上下文创建LayoutInflater的情况下,您有机会放弃您的主题设置。请参阅more的详细信息。

修订

source code of layout inflater

Object[] args = mConstructorArgs; 
args[1] = attrs; 

constructor.setAccessible(true); 
final View view = constructor.newInstance(args); 
if (view instanceof ViewStub) { 
    // Use the same context when inflating ViewStub later. 
    final ViewStub viewStub = (ViewStub) view; 
    viewStub.setLayoutInflater(cloneInContext((Context) args[0])); 
} 
return view; 

正如你所看到的,你的情况下(在你的情况下,应用程序上下文)经过鉴于结构。这意味着你的观点范围将是应用程序,而不是活动。

2

是的,这是真的。考虑风格有很大的不同。

LayoutInflater通过调用它们的构造函数来创建视图。它通过你传递给它的上下文。因此,如果您使用应用程序上下文而不是活动上下文,则可能缺少一些信息。

这和使用应用程序上下文直接创建视图一样。活动可以定义不同的样式,其上下文包装这些信息。

考虑到你如何得到它,没有太大的区别。调用内部LayoutInflater.cloneInContext(Context)以应用不同的上下文配置。

创建一个现有的LayoutInflater对象的副本,其副本指向与原始副本不同的Context。这被ContextThemeWrapper用来创建新的LayoutInflater以配合新的Context主题。

有了应用程序上下文,你不会得到这个。

1

如果我们应用程序上下文意味着,inflater实例存在于整个应用程序中,直到应用程序被终止。在其他情况下,如果我们使用活动上下文,一旦活动被破坏,inflater实例将被移除。