LayoutInflater有两个参数inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot),inflate(XmlPullParser parser, ViewGroup root)它们的区别在于:

首先, LayoutInflater这个类是用来干嘛的呢?

我们最常用的便是 LayoutInflater的inflate方法,这个方法重载了四种调用方式,分别为:

1. public View inflate(int resource, ViewGroup root)

2.  public View inflate(int resource, ViewGroup root, boolean attachToRoot)

3.public View inflate(XmlPullParser parser, ViewGroup root)

4.public View inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot)

这四种使用方式中,我们最常用的是第一种方式, inflate方法的主要作用就是将xml转换成一个View对象,用于动态的创建布局。虽然重载了四个方法,但是这四种方法最终调用的,还是第四种方式。第四种方式也很好理解,内部实现原理就是利用Pull解析器,对Xml文件进行解析,然后返回View对象。

我们以我们经常使用的第一种形式为例,你在重写BaseAdapter的getView方法的时候是否这样做过

<span class="keyword">public</span> View getView(<span class="keyword">int</span> position, View convertView, ViewGroup parent) {<span class="keyword">if</span> (convertView == <span class="keyword">null</span>) {convertView = inflate(R.layout.item_row, <span class="keyword">null</span>);}<span class="keyword">return</span> convertView;
}

inflate方法有三个参数,分别是

1. resource 布局的资源id

2. root 填充的根视图

3.

attachToRoot是否将载入的视图绑定到根视图中

在这个例子中,我们将root参数设为空,功能确实实现了,但是这里还隐藏着一个隐患,这种方式并不是 inflate 正确的使用姿势,下面我们通过一个Demo,来说一下这样使用造成的弊端。

首先,我们建立一个这样的项目

这里三个界面,一个主界面,两个测试界面,布局文件中,主界面只负责界面跳转,两个测试界面都是一个简单的Listview,item布局显示效果如下

对应的布局文件如下

两个文件最关键的区别就一句话,

在getView方法中,OneActivity是

convertView = inflater.inflate(R.layout.item_list, null);

在getView方法中,TwoActivity是

convertView = inflater.inflate(R.layout.item_list, parent,false);

我们先看一下显示效果,再说两者的区别

OneActivity效果

TwoActivity的显示效果

我们可以很明显的看出来,使用第一种方式,根布局的高度设置60dp没有起作用,系统还是按照包裹内容的方式加载的,为什么会产生这种效果呢?我们从需要inflate方法的源代码中找一下答案。

代码比较长,我们重点关注下面的代码
现在应该明白了吧,当我们传进来的root不是null,并且第三个参数是false的时候,这个temp就被加入到了root中,并且把root当作最终的返回值返回了。而当我们设置root为空的时候,没有设置 LayoutParams参数的temp对象,作为返回值返回了。

因此,我们可以得出下面的结论:

1.若我们采用 convertView = inflater.inflate(R.layout.item_list, null);方式填充视图,item布局中的根视图的layout_height属性会被忽略掉,即所有的layout——xxx属性都会被忽略掉然后设置成默认的包裹内容方式

2.如果我们想保证item的视图中的参数不被改变,我们需要使用convertView = inflater.inflate(R.layout.item_list, parent,false);这种方式进行视图的填充

3.除了使用这种方式,我们还可以设置item布局的根视图为包裹内容,然后设置内部控件的高度等属性,这样就不会修改显示方式了。

4.另外用convertView = inflater.inflate(R.layout.item_list,null),会有警告

这里IDE会弹出warning:

Avoid passing null as the view root (needed to resolve layout parameters on the inflated layout’s root element)

提示我们不要传递”null”作为root的参数,因为需要决定root节点的属性。

在这里,可以换用另一个inflate方法来避免这个warning:

<code class="language-java hljs  has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> View <span class="hljs-title" style="box-sizing: border-box;">getView</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> position, View convertView, ViewGroup parent) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (convertView == <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>) {<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 使用三个参数的inflate方法,设定root参数为getView中的parent参数,设定attachToRoot为false</span>convertView = layoutInflater.inflate(R.layout.list_item, parent, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">false</span>);}
}</code>

参考链接:

http://blog.csdn.net/ucxiii/article/details/50972739

http://blog.csdn.net/lzq520210/article/details/50577392

LayoutInflater——inflate方法不同参数的区别相关推荐

  1. 深入理解 LayoutInflater.inflate() 方法

    目录 1. 前言 2. 正文 2.1 inflate() 方法分析 2.1.1 根节点不是 merge 时,第一组取值情况分析 2.1.2 根节点不是 merge 时,第二组取值情况分析 2.1.3 ...

  2. LayoutInflater.inflate()方法解析

    1.基本介绍 在开发中 LayoutInflater. inflate() 这个方法还是非常有用的,它的作用类似于 findViewById().不同点是 inflate() 是用来找 res/lay ...

  3. LayoutInflater.inflate()方法两个参数和三个参数

    转载请标明出处:https://www.cnblogs.com/tangZH/p/7074853.html 很多人都用过LayoutInflater(布局填充器) 对于我来说通常使用下面两种:Layo ...

  4. inflate方法两个参数和三个参数的区别

    前言 今天在lint项目的代码时,又遇到了inflate方法的参数问题,之前看过相关的文章,又没有记录下来,导致时间长了就忘记了.今天再次遇到这个问题,便老老实实记录一下LayouInflater中i ...

  5. 带你看懂LayoutInflater中inflate方法

    关于inflate问题,我想很多人多多少少都了解一点,网上也有很多关于这方面介绍的文章,但是枯燥的理论或者翻译让很多小伙伴看完之后还是一脸懵逼,so,我今天想通过三个案例来让小伙伴彻底的搞清楚这个东东 ...

  6. Android之Inflate()方法用途

    flate()作用就是将xml定义的一个布局找出来,但仅仅是找出来而且隐藏的,没有找到的同时并显示功能.最近做的一个项目就是这一点让我迷茫了好几天. Android上还有一个与Inflate()类似功 ...

  7. Inflate()---Android之Inflate()方法用途

    Inflate()作用就是将xml定义的一个布局找出来,但仅仅是找出来而且隐藏的,没有找到的同时并显示功能.最近做的一个项目就是这一点让我迷茫了好几天. android上还有一个与Inflate()类 ...

  8. 三个案例带你看懂LayoutInflater中inflate方法两个参数和三个参数的区别

    本文转载自[http://blog.csdn.net/u012702547/article/details/52628453] 关于inflate参数问题,我想很多人多多少少都了解一点,网上也有很多关 ...

  9. View.inflate和LayoutInflater的inflate方法区别

    平时ListView加载item中,adapter的getView方法中,我们经常用到: LayoutInflater.from(mContext).inflate(R.layout.it ,pare ...

最新文章

  1. 在 Kubuntu 21.04 中安装和升级 KDE Plasma 5.2
  2. Android SERVICE后台服务进程的自启动和保持
  3. asp.net网页出现名称以无效字符开头的解决方法
  4. linux内核单独安装,Linux内核编译与安装
  5. vivado编译出错 [Synth 8-729] [Synth 8-787]
  6. 用cmake编译caffe
  7. html突出显示,javascript-记住html页面中突出显示的文本(向html页面添加注释)
  8. 锐界机器人_2019款锐界智能家居远程控制使用介绍
  9. 奉劝那些想学编程的人
  10. 关于动态生成div的认识
  11. Python(65)_写函数,判断用户传入列表的长度,若大于2,则仅保留前两个长度的内容,并将其返回给调用者...
  12. golang slice分割和append copy还是引用
  13. linux上scrapy项目的创建,Python网络爬虫4 ---- Linux下编写最简单的scrapy网络爬虫项目...
  14. PDF文档如何解密?3个软件值得收藏
  15. oracle经纬度精确查询位置,基于经纬度定位车辆所在交通小区位置的方法与流程...
  16. 留学生 电脑安全与维护手册 (留学须知)
  17. 降噪蓝牙耳机排行榜10强,通话质量好的降噪蓝牙耳机推荐
  18. 在html中通过使用css解决高度塌陷问题
  19. golang 常量 iota
  20. Java中序列化实现原理研究

热门文章

  1. flex java 上传下载_完整的Flex多文件上传实例
  2. 微软的基础服务器,微服务器当道 微软云端基础构架揭秘
  3. OpenShift 4 Hands-on Lab (7) - 用Jenkins Pipeline实现在不同运行环境中升迁部署应用
  4. OpenShift 4 之 高可靠运行MS SQL Server 2019数据库
  5. OpenShift 4 之进入到集群节点内执行sosreport收集故障信息
  6. CodeFirst的EF6迁移和时间戳错误
  7. 为制造业构建Teams Power App 3:创建制造商UI
  8. (六)为时装设计生成训练和运行GAN
  9. 微软开始取消 Windows 10 对 32 位系统的支持
  10. LINQ to CSV,一种类型安全,动态的高性能方法