自我开始学习安卓,这个LayoutInflater就一直困惑着我,Inflate翻译成中文是膨胀的意思,但是翻译成布局膨胀器倒不合理,而我一直叫它“布局解析器”,今天就要揭开这个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