android - 为什么 LayoutInflater 的功能不是静态的,即使它明确接受父/根?
问题描述
从我在 Stackoverflow 到现在的理解......实例LayoutInflater
所做的所有事情都是接受要膨胀的 XML 布局文件(可能使用一些内部 XML 解析器和迭代逻辑来实例化树状结构中的视图设置它的属性相应) 以及树应附加到的父级以及可选attachToRoot
参数。这意味着充气器本身不保存任何来自它被实例化的地方的唯一信息。那么为什么创建/扩展视图的功能不能以简单的静态方法的形式提供,该方法只是使用传递给它的参数创建视图呢?是我错过了什么吗?
另外,我无法理解......这个答案中的代码将attachToRootattachToRoot
传递为 false 并声明布局不会直接附加视图?这是否意味着如果我们通过 true,我们就不需要手动添加该视图?(再次作为一个附带问题,如果我们在添加后更改属性,应用程序的行为是否会有所不同)https://stackoverflow.com/a/41500409/10104608
解决方案
LayoutInflater
使用资源(XML 布局文件、字符串资源、维度资源等)来完成工作。资源文件不是唯一的,因为它们可能依赖于设备、依赖于语言等。因此,LayoutInflater
需要Context
确保它可以访问资源文件,并且它可以确定用于给定的许多可能的资源文件中的哪一个资源参考。对 a 的这个要求Context
就是为什么你需要一个LayoutInflater
实例(而不是使用static
方法调用)。
关于您关于“附加到根”的问题:您可以手动膨胀 aView
并将其添加到View
层次结构中,或者您可以让其LayoutInflater
自动执行。这是“附加到根”参数的目的。
我没有查看代码,LayoutInflater
但如果在实例中缓存了一些资源数据,我不会感到惊讶,因为可能只LayoutInflater
为每个实例创建了一个实例,Context
并且该实例可能是共享/重用的。
推荐阅读
- ssl - nginx conf ssl sslabs B 等级
- jquery - 除了我选择播放的视频外,如何暂停所有 html5 视频?
- php - 在 PHP 中的数组中解析矩阵和映射数学函数
- ruby-on-rails - 添加了 mathjax-rails 以在 chrome 中加载 mathml 但无法正常工作
- python - Pygame-两个显示更新同时使用 pygame.time.wait() 函数
- ansible - Ansible - 用户插入的拆分字符串
- java - 从不同来源调用相同的函数会导致不同的输出?如何?
- jenkins - 在 Jenkins 中成功安装机器人框架插件后,“发布机器人框架测试结果”未显示在 Post-build 中
- c - Contiki Cooja Sky mote 模拟中的 Energest CPU 读数正在下降
- c - 基于堆栈的缓冲区溢出 - “shell 代码”的返回地址