Android Studio(Kotlin)中LayoutInflater及inflate方法作用通俗解释
LayoutInflater与inflate方法通俗说明
此前同主题的Java实现讨论和Kotlin写法的核心逻辑完全一致,不存在语言层面的原理差异,你提到的代码片段是RecyclerView适配器中创建item视图的标准写法:
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { // create a new view val adapterLayout = LayoutInflater.from(parent.context) .inflate(R.layout.list_item, parent, false) return ItemViewHolder(adapterLayout) }
不用纠结官方文档的书面表述,两个概念可以直接用大白话理解:
- LayoutInflater:本质是Android系统提供的「布局XML转换器」。你写在res/layout目录下的布局文件只是按规则编写的纯文本标记,系统无法直接读取这类文本渲染成屏幕上的控件,LayoutInflater的作用就是把这类XML标记,转换成系统可识别、可渲染、可交互的真实View类对象。
- inflate():就是LayoutInflater执行转换动作的具体方法,所谓「从指定XML节点填充生成新的视图层级」,就是把XML里写的布局、控件、嵌套关系,一层层转换成内存里真实存在的View对象树。
结合这段代码里的三个参数,就能完全搞懂inflate的实际运行逻辑:
- 第一个参数
R.layout.list_item:指定需要转换的XML布局文件,这里就是列表单个条目的布局。 - 第二个参数
parent:指定转换出来的View最终要挂载的父容器(这段代码里就是承载item的RecyclerView本身)。传入这个值不是为了直接把View加进去,是为了让系统根据父容器的尺寸规则,正确计算待转换View的布局参数——比如XML里写了match_parent,没有父容器的参考,系统根本不知道要匹配多大的尺寸,最终渲染出来的布局就会出现宽高失效、边距错乱的问题。 - 第三个参数
false:告诉转换器只需要完成XML到View的转换、按父容器规则算好布局参数即可,不要主动把生成的View添加到父容器中。因为RecyclerView自身会在合适的时机统一完成item的挂载操作,这里如果传true,会触发重复添加View的运行时错误。
新手最常踩的坑就是写inflate时把第二个参数传null,这会导致系统拿不到父容器的尺寸规则,就算XML里写了正确的宽高、边距属性,最终渲染效果也会和预期不符。
内容的提问来源于stack exchange,提问作者Theprogrammingnoob
相关产品推荐
相关产品推荐

