为什么即使 LayoutInflater 明确接受父/根,它的功能也不是静态的?

问题描述

从我在 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}} 并且此实例可能已共享/重用。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...