LayoutInflater

来源:互联网 发布:lte速率优化 编辑:程序博客网 时间:2024/05/17 00:09

自我开始学习安卓,这个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{}

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)

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

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)

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

5 总结

inflate(resource,root,attachRoot)第一个参数不解释,很简单第二个参数如果不为null的话,那么就按照resource的根布局参数剪花贴在root上;如果为null,那么就默认这个根布局参数为match_parent剪花贴在root上第三个参数如果为false,就不贴花了,即使我按照参数剪好了也不贴花了,所以view上看不到新视图,设置为true就是把花贴在root上,可以看到了

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

原创粉丝点击