getLayoutInflater与LayoutInflater.from的区别

14

在研究一些(已知为优秀的)代码时,我可以看到逻辑如下:

if (getContext() instanceof Activity) {
      inflater=((Activity)getContext()).getLayoutInflater();
}
    else {
      inflater=LayoutInflater.from(getContext());
}

我想知道为什么要使用这个if/else,是否在所有情况下都可以只使用LayoutInflater.from


3
获取 LayoutInflater 的方式存在多种变体,但它们都是相同的。以下是四种不同的获取 LayoutInflater 的方法: LayoutInflater inflater1 = context.getLayoutInflater(); LayoutInflater inflater2 = context.getWindow().getLayoutInflater(); LayoutInflater inflater3 = LayoutInflater.from(context); LayoutInflater inflater4 = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - HendraWD
3个回答

17

这并不是很重要。

活动getLayouInflater()委托给Window。通常情况下,Window的策略实现会反过来使用LayoutInflater.from(context)初始化其inflater,其中context是该活动。

因此,如果是一个活动,则inflater对象实际上是相同的,使用相同的Context

LayoutInflater.from()实际上是Context.getSystemService()的包装器。现在,系统服务是通过名称从地图中查找,然后从缓存中检索。与在Activity中访问已初始化成员变量相比,这种查找具有一定的开销。

因此,它看起来像是一种微小的优化,与实际的视图层次结构膨胀相比,不太可能影响运行时性能。

这种优化实际上可能会对开发人员的生产力产生负面影响,因为人们需要停下来思考为什么代码在那里。


4

从相同的代码来看,似乎LayoutInflater.from在不是Activity的上下文中使用。我会认为使用Activity的inflater会重用已经创建的inflater,而另一种选择则会从上下文中创建一个layoutinflater。

我唯一要做的更改是将上下文保存在变量中,以防止重复调用相同的函数并从对象中检索相同的值:

Context ctx = getContext();
if(ctx instanceof Activity) {
  inflater = ((Activity)ctx).getLayoutInflater();
}
else {
  inflater = LayoutInflater.from(ctx);
}

Android有许多优化措施来重复使用可用的项,比如ListView中可以重复使用的视图。


0

根据Android文档建议使用getLayoutInflater()。文档对LayoutInflator.from的说明如下:

将布局XML文件实例化为相应的View对象。它从未直接使用。相反,

建议使用:

使用Activity.getLayoutInflater()或Context#getSystemService检索标准LayoutInflater实例,该实例已连接到当前上下文并正确配置为您正在运行的设备。

换句话说,为了简化代码和提高性能,最好使用已初始化的上下文中的getLayoutInflater。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接