inflater是否需要Activity的上下文?

时间:2016-09-21 07:09:21

标签: android android-layout

我有时会通过Dagger注入LayoutInflater的链接,并在应用程序上下文模块中生成它,如下所示:LayoutInflater.from(application);。它减少了代码行。

但大学告诉我这是错误的方式,必须通过LayoutInflater.from(MainActivity.this);

从活动背景中提供

这是真的吗?布局inflater的行为是否取决于上下文的类型?

4 个答案:

答案 0 :(得分:2)

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

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

与使用应用程序上下文直接创建视图相同的问题。活动可以定义不同的样式,它们的上下文包含这些信息。

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

  

创建现有LayoutInflater对象的副本,副本指向与原始对象不同的ContextContextThemeWrapper使用此功能创建新的LayoutInflater以配合新的Context主题。

根据应用程序上下文,您无法获得此信息。

答案 1 :(得分: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;

如您所见,您的上下文(在您的情况下是应用程序上下文)传递View的构造。这意味着您的视图范围将是应用程序,而不是活动。

答案 2 :(得分:1)

如果我们的应用程序上下文意味着,整个应用程序中都存在inflater实例,直到应用程序被终止。在其他情况下,如果我们使用活动上下文,一旦活动被销毁,就会删除inflater实例。

答案 3 :(得分:-1)

当您知道自己需要一个上下文时,可以使用getApplicationContext(),这个上下文可能会比您services所拥有的任何其他可能的上下文更长久。

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

希望它会有所帮助。