首页 > 解决方案 > 为什么 LayoutInflater 的功能不是静态的,即使它明确接受父/根?

问题描述

从我在 Stackoverflow 到现在的理解......实例LayoutInflater所做的所有事情都是接受要膨胀的 XML 布局文件(可能使用一些内部 XML 解析器和迭代逻辑来实例化树状结构中的视图设置它的属性相应) 以及树应附加到的父级以及可选attachToRoot参数。这意味着充气器本身不保存任何来自它被实例化的地方的唯一信息。那么为什么创建/扩展视图的功能不能以简单的静态方法的形式提供,该方法只是使用传递给它的参数创建视图呢?是我错过了什么吗?

另外,我无法理解......这个答案中的代码将attachToRootattachToRoot传递为 false 并声明布局不会直接附加视图?这是否意味着如果我们通过 true,我们就不需要手动添加该视图?(再次作为一个附带问题,如果我们在添加后更改属性,应用程序的行为是否会有所不同)https://stackoverflow.com/a/41500409/10104608

标签: androidandroid-layoutlayout-inflater

解决方案


LayoutInflater使用资源(XML 布局文件、字符串资源、维度资源等)来完成工作。资源文件不是唯一的,因为它们可能依赖于设备、依赖于语言等。因此,LayoutInflater需要Context确保它可以访问资源文件,并且它可以确定用于给定的许多可能的资源文件中的哪一个资源参考。对 a 的这个要求Context就是为什么你需要一个LayoutInflater实例(而不是使用static方法调用)。

关于您关于“附加到根”的问题:您可以手动膨胀 aView并将其添加到View层次结构中,或者您可以让其LayoutInflater自动执行。这是“附加到根”参数的目的。

我没有查看代码,LayoutInflater但如果在实例中缓存了一些资源数据,我不会感到惊讶,因为可能只LayoutInflater为每个实例创建了一个实例,Context并且该实例可能是共享/重用的。


推荐阅读