我有时会通过Dagger注入LayoutInflater
的链接,并在应用程序上下文模块中生成它,如下所示:LayoutInflater.from(application);
。它减少了代码行。
但大学告诉我这是错误的方式,必须通过LayoutInflater.from(MainActivity.this);
这是真的吗?布局inflater的行为是否取决于上下文的类型?
答案 0 :(得分:2)
是的,这是真的。考虑到风格,这有很大的不同。
LayoutInflater
通过调用其构造函数来创建视图。在那里它传递你传递给它的上下文。因此,如果您使用应用程序上下文而不是活动上下文,则可能缺少某些信息。
与使用应用程序上下文直接创建视图相同的问题。活动可以定义不同的样式,它们的上下文包含这些信息。
考虑到你如何得到它,并没有太大的区别。调用内部LayoutInflater.cloneInContext(Context)
以应用不同的上下文配置。
创建现有
LayoutInflater
对象的副本,副本指向与原始对象不同的Context
。ContextThemeWrapper
使用此功能创建新的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
。
希望它会有所帮助。