inflate方法参数意义

inflate( int resource, ViewGroup root, boolean attachToRoot)

resource : 资源id
root :容器
attachToRoot : 是否添加入容器

再聊每个参数的具体作用之前,我们先看下inflate的几种常用写法

layoutInflater.inflate(R.layout.xx, null)
layoutInflater.inflate(R.layout.xx, root, false)
layoutInflater.inflate(R.layout.xx, root, true)

root是否为空的影响:
如果root为空,则R.layout.xx根布局的宽高、margin等需要依赖父容器计算出来的值,就都无效了。但像padding这种view自身决定的属性值还是生效的

attachToRoot:
true时,inflate返回的view就是root,R.layout.xx布局生成的view会自动添加到root中
false时,inflate返回的view就是R.layout.xx布局生成的view

所以在使用attachToRoot = true时,我们要注意下面这种写法

 for (index in 0..5) {
     val view = layoutInflater.inflate(R.layout.xx, root, true)
     val tvContent = view.findViewById(R.id.tv_content)
     tvContent.text = index.toString()
 }

这种写法会导致,我们只有一个tvContent被成功赋值了,但text文本是5.
这和我们的预期完全不同,主要就是因为attachToRoot = true时,我们返回的view是root本身.
那么我们调用root.findViewById返回的其实就是第一个id相同的控件,
故而只有第一个tvContent被成功赋值,且值为5

所以如果我们有循环生成布局,且需要填充布局的逻辑时,是不可以使用attachToRoot = true的,建议使用下面的写法

for (index in 0..5) {
    val view = layoutInflater.inflate(R.layout.xx, root, false)
    val tvContent = view.findViewById(R.id.tv_content)
    tvContent.text = index.toString()
    viewBinding.llAttachFalse.addView(view)
}

你可能感兴趣的:(inflate方法参数意义)