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<TextView>(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<TextView>(R.id.tv_content)
tvContent.text = index.toString()
viewBinding.llAttachFalse.addView(view)
}
网友评论