美文网首页
inflate方法的三种形式

inflate方法的三种形式

作者: 我啊翔1314 | 来源:发表于2018-07-03 23:58 被阅读0次

    我们绘制布局界面,一般通过xml文件,以标签的形式去完成界面的开发,然后通过setContentView去解析就可以显示界面了。这样的好处是逻辑清晰,不容易混淆。当然,我们也可以通过代码添加view,但是应尽量避免,因为代码添加view往往需要很大的代码量,这会降低代码的可读性。但是,某些情况下,我们仍需要使用代码去添加view。要添加view,首先需要初始化布局加载器,然后调用inflate方法解析xml,该节将详细讲解inflate方法的三种形式。

    一、布局的初始化

    获得一个布局加载器的方法如下:

    LayoutInflater inflater = context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
    LayoutInflater inflater = getLayoutInflater();
    LayoutInflater inflater = LayoutInflater.from(this);
    

    第一、二种实质上都是使用第三种形式。其实,Activity的setContentView方法也是基于第三种形式实现。初始化布局加载器以后,通过调用inflate方法就可以解析xml,获取view。

    二、inflate的三种形式

    inflate方法有多种方法重载,但总结起来也就只有三种:

    1.inflate(layoutId, null)

    即初始化view时,设置其根节点rootGroup为空,此种形式初始化的布局,其根节点的属性将失效,因为没有父布局,无法配置根节点属性,根节点的宽高都将默认设置为wrap_content。要设置根节点属性,需要通过初始化一个ViewGroup.LayoutParam的实例:

    //初始化父布局viewGroup
    ...
    ViewGroup.LayoutParam param = new ViewGroup.LayoutParam(ViewGroup.LayoutParam.MATCH_PARENT, ViewGroup.LayoutParam.WRAP_CONTENT);LayoutInflater inflater = LayoutInflater.from(this);
    View view = inflater.inflate(R.layout.view_main, null);//获取ViewGroup
    view.setLayoutParam(param);//设置布局属性
    viewGroup.addView(view);//将view添加在viewGroup中
    

    这样view根节点的属性就会根据param去进行设置。此外,需要提一点的是,inflate(layoutId, null)与inflate(layoutId, null, false)或者inflate(layoutId, null, true)是等价的。因为当rootGroup为空时,attachToRoot参数将失效。

    2.inflate(layoutId,rootGroup,false)

    也许有人会疑问,既然attachToRoot设置为false,为啥还要添加rootGroup呢?直接设置为null不就可以了?其实不然,添加rootGroup的原因在于能够view自动配置根节点属性。因为设置了viewGroup,那么view的根节点将不会失效,这样就不用通过ViewGroup.LayoutParam去设置根节点属性了。

    //初始化父布局viewGroup
    ...
    LayoutInflater inflater = LayoutInflater.from(this);
    View view = inflater.inflate(R.layout.view_main, viewGroup, false);// 将viewGroup设置为view的父布局
    viewGroup.addView(view);//将view添加在viewGroup中
    

    3.inflate(layoutId,rootGroup,true)

    这种形式很好理解,初始化view并将view添加到rootGroup中。当inflate执行完以后,view已经添加到rootGroup中了,因此,不能再调用addView方法去添加view,否则会报java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first的错误

    //初始化父布局viewGroup
    ...
    LayoutInflater inflater = LayoutInflater.from(this);
    //将viewGroup设置为view的父布局,并设置attachToRoot为true
    View view = inflater.inflate(R.layout.view_main, viewGroup, false);
    //不能调用该方法,view已经添加到viewGroup中,不能重复添加
    viewGroup.addView(view)
    

    以下链接是本篇文章参考的博客:
    1.三个案例带你看懂LayoutInflater中inflate方法两个参数和三个参数的区别

    相关文章

      网友评论

          本文标题:inflate方法的三种形式

          本文链接:https://www.haomeiwen.com/subject/ohdsuftx.html