Android的LayoutInflater

自我开始学习安卓,这个LayoutInflater就一直困惑着我,Inflate翻译成中文是膨胀的意思,但是翻译成布局膨胀器倒不合理,而我一直叫它“布局解析器”,今天就要揭开这个LayoutInflater的神秘面纱,在揭开面纱之前希望大家先看下这篇文章,了解一下基础知识

LayoutInflater-使用

1 LayoutInflater源码说明

Instantiates a layout XML file into its corresponding {@link android.view.View}objects. It is never used directly. 

public abstract class LayoutInflater{}
  
  
  • 1
  • 2
  • 3

LayoutInflater类是一个抽象类,它的作用是实例化一个xml布局文件使之成为一个view对象,这个类不直接使用而是通过以下两种方法使用:

LayoutInflater.from(Context context)//第一种方法

(LayoutInflater)Context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);//第二种方法

如果你去查看第一种方法的源码,你会发现其实内部用了第二种方法,所以二者其实是一回事

这里写图片描述

这两种方法我们其实最常用的是第一种,,主要有以下几种使用场景:

LayoutInflater.from(this).inflate(R.layout.child,null)

LayoutInflater.from(this).inflate(R.layout.child,frameLayout,false)

LayoutInflater.from(this).inflate(R.layout.child,frameLayout,true)
  
  
  • 1
  • 2
  • 3
  • 4
  • 5

2 inflate使用

这里写图片描述

这个方法的作用是从指定的xml文件中解析一个新的视图结构,我们可以把每个布局理解成一张纸,这个inflate就是一把剪刀,你把一张纸上的花剪下来然后贴到另一张纸上,其实就可以大致描述这个inflate方法的作用

resource 表示xml文件的id,将来就是要把这个布局的视图结构取下来,相当于用剪刀把这张纸上的花剪下来
root 表示新布局要被放置的viewGroup,上面你把花剪了下来不是要放在另一张纸上吗?这个root就是另一张纸上花要被放置的位置
attachToRoot 理解为是否把花贴在root上,true表示贴上,你就可以看到另一张纸上有一朵花,false表示不贴,你虽然剪了一朵花但是你咩有贴上去

所以很好理解这段代码:

  View view = LayoutInflater.from(this).inflate(R.layout.child,frameLayout,true);

  将child布局文件中的视图结构剪出来贴在frameLayout中,注意这里view就是有新视图结构的view了,不用再addView
  
  
  • 1
  • 2
  • 3

3 剪刀怎么剪?

让我们来看下child布局代码

这里写图片描述

注意此时根布局属性都是match_parent,所以整个视图其实就是右侧红色框,(如果不是macth_parent那么根布局宽高数值多大红色框就是多大),剪刀把这个红色框的花剪下来(注意不是那个正方形button的布局),剪下来的时候会记录这个红花的布局参数信息(多宽啊,多高啊)接下来就把这个红色的花根据frameLayout的布局参数放在frameLayout中,这个过程会因为frameLayout参数不同而发生不同的情况,下面逐一解释:

1 假如frameLayout设置宽高参数都是match_parent,那么这个红花的布局宽高也会设置为match_parent;frameLayout设置参数都是100dp,也就是说这个红花的布局就在100dp内部设置了,假如红花中button的宽度是200dp,那么对不起,我的frameLayout只能显示100dp,剩下的100dp就显示不出来了

2 假如frameLayout设置宽高参数都是wrap_content,这种情况比较特殊,在此之前我们需要知道:父布局设置wrap_content而子布局设置match_parent,那么这个布局是wrap_content的,match_parent是填充父布局而不是和屏幕宽度或高度相等,看下图就明白

这里写图片描述

红花宽高都是match_parent,但是frameLayout的布局是wrap_content,所以这朵红花相当于被裁剪成wrap_content的形状(在这里就是button多大就显示多大的花)

这里写图片描述

4 设置null?

LayoutInflater.from(this).inflate(R.layout.child,null)
  
  
  • 1

使用inflate另外两个方法的时候就是按照3中裁剪方法剪花就可以,但是设置null稍微有点不同,哪里不同呢?就是根布局无论原本被设置成什么,使用null就会让根布局的参数宽和高都变为match_parent

5 总结

inflate(resource,root,attachRoot)

第一个参数不解释,很简单

第二个参数如果不为null的话,那么就按照resource的根布局参数剪花贴在root上;如果为null,那么就默认这个根布局参数为match_parent剪花贴在root上

第三个参数如果为false,就不贴花了,即使我按照参数剪好了也不贴花了,所以view上看不到新视图,设置为true就是把花贴在root上,可以看到了
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

关于这个LayoutInflater就分析到这里,请大家原谅我的语言表达不清,如果对文章有任何疑问和建议,欢迎在评论区留言,希望在交流中一同进步。

转自LosingCarryJie的博客:http://blog.csdn.net/LosingCarryJie/article/details/76736253?locationNum=1&fps=1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值