LayoutInflater.from(this).inflate()详解

需求:经常需要从其他布局引入到当前布局中
inflate:英文翻译膨胀的,挺贴切的

解决问题:

  1. 为什么我布局没有显示出来
  2. 为什么我根布局明明设置了属性了啊,怎么没生效呢
  3. 返回给我的view是我的根布局还是父容器呢

问题的产生是infate()参数不同导致的结果

第一种

root != null, attachToRoot=true(默认也是true)

LinearLayout root = (LinearLayout) findViewById(R.id.layout);
View view1 = LayoutInflater.from(this).inflate(R.layout.item, root, true);
View view2 = LayoutInflater.from(this).inflate(R.layout.item, root);

结果:
返回的view是父容器(root)布局
item根布局的宽高属性生效
已经添加到父容器(root)中

第二种

root != null, attachToRoot=false

LinearLayout root = (LinearLayout) findViewById(R.id.layout);
View view1 = LayoutInflater.from(this).inflate(R.layout.item, root, false);

结果:
返回item根布局
根布局的宽高属性生效
未添加到父容器(root)中

第三种

root == null,attachToRoot=false/true

View view = LayoutInflater.from(this).inflate(R.layout.item, null, false);
View view = LayoutInflater.from(this).inflate(R.layout.item, null, true);
View view = LayoutInflater.from(this).inflate(R.layout.item, null);

结果:
返回item根布局
根布局的宽高属性失效
未添加到父容器(root)中

一般经验来说:LayoutInflater.from(this).inflate(R.layout.item, null)用的最多
但是碰到要添加到列表的记得需要root,root一般就是列表控件,要不然宽高属性失效,你就纳闷怎么没显示的呢

如果恰好解决你的问题或者学到了新知识,就点个赞

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注