问题描述
从我在 Stackoverflow 中所了解的到现在... LayoutInflater
的实例所做的只是接受要膨胀的 XML 布局文件(可能使用一些内部 XML 解析器和迭代逻辑从树状结构相应地设置它的属性)以及树应附加到的父级以及可选的 attachToRoot
参数。这意味着 inflater 本身不保存任何来自它被实例化的任何地方的独特信息。那么为什么创建/膨胀视图的功能不能以简单的静态方法的形式提供,该方法只是使用传递给它的参数创建视图?是不是我错过了什么?
另外,我无法理解 attachToRoot
的概念......这个答案中的代码将 attachToRoot 传递为 false 并声明布局不会直接附加视图还 ?这是否意味着如果我们通过 true,我们就不需要手动添加该视图? (再次作为一个附带问题,如果我们在添加后更改属性,应用程序的行为是否会有所不同)https://stackoverflow.com/a/41500409/10104608
解决方法
LayoutInflater
使用资源(XML 布局文件、字符串资源、维度资源等)来完成它的工作。资源文件不是唯一的,因为它们可以依赖于设备、依赖于语言等。因此,LayoutInflater
需要一个 Context
来确保它可以访问资源文件,并且它可以确定哪些用于给定资源引用的许多可能的资源文件。对 Context
的这一要求就是您需要 LayoutInflater
实例(而不是使用 static
方法调用)的原因。
关于“附加到 root”的问题:您可以手动扩充 View
并将其添加到 View
层次结构中,或者您可以让 LayoutInflater
自动执行此操作。这就是“附加到根目录”参数的目的。
我没有查看 LayoutInflater
的代码,但如果某些资源数据缓存在实例中,我不会感到惊讶,因为可能只有一个 LayoutInflater
实例为每个 {{ 创建1}} 并且此实例可能已共享/重用。