精华内容
参与话题
问答
  • LayoutInflater

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

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

    展开全文

空空如也

1 2 3 4 5 ... 20
收藏数 9,130
精华内容 3,652
关键字:

layoutinflater