对于LayoutInflater.from(this).inflate()方法的理解

这篇具有很好参考价值的文章主要介绍了对于LayoutInflater.from(this).inflate()方法的理解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

对于LayoutInflater.from(this).inflate()方法的几个参数以及用法总是迷迷糊糊,源码看了忘,忘了看,因此决定写这篇博客做下记录。

源码解析

我们知道,调用LayoutInflater.from(this).inflate()方法最终都会走三参的方法
public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot)
,这里先简单说明下三个参数:

resource:表示需要加载资源的id;

root:表示resource资源需要被添加的根布局;

attachToRoot:表示resource是否需要被绑定到root上;

接下来我们重点分析下相关源码

inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot)

    public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot) {
        final Resources res = getContext().getResources();
		...
        View view = tryInflatePrecompiled(resource, res, root, attachToRoot);
        if (view != null) {
            return view;
        }
        XmlResourceParser parser = res.getLayout(resource);
        try {
            return inflate(parser, root, attachToRoot);//重点看这个代码
        } finally {
            parser.close();
        }
    }

inflate(parser, root, attachToRoot)

  public View inflate(XmlPullParser parser, @Nullable ViewGroup root, boolean attachToRoot) {
        synchronized (mConstructorArgs) {
          	...
            View result = root; //result默认赋值为root

            try {
             	...
                if (TAG_MERGE.equals(name)) {
  					.... //merge标签 这里不关注
                } else {
                    // 将temp赋值为xml资源的根布局view
                    final View temp = createViewFromTag(root, name, inflaterContext, attrs);
                    ViewGroup.LayoutParams params = null;
					
                    if (root != null) {
                       	//如果传入的root参数不为空,则创建root对应的LayoutParams
                        params = root.generateLayoutParams(attrs);
                        if (!attachToRoot) {
                            //如果传入的attachToRoot为false,则给temp布局设置LayoutParams
                            temp.setLayoutParams(params);
                        }
                    }

      
                    // 绑定children
                    rInflateChildren(parser, temp, attrs, true);
					...
                    if (root != null && attachToRoot) {
                    	//如果root不为null并且attachToRoot为true时,将temp添加到root中,并设置对应的LayoutParams
                        root.addView(temp, params);
                    }

                    if (root == null || !attachToRoot) {
                    	// root为null 或者 attachToRoot为false时,result = temp
                        result = temp;
                    }
                }

            } catch (XmlPullParserException e) {
                final InflateException ie = new InflateException(e.getMessage(), e);
                ie.setStackTrace(EMPTY_STACK_TRACE);
                throw ie;
            } catch (Exception e) {
                final InflateException ie = new InflateException(
                        getParserStateDescription(inflaterContext, attrs)
                        + ": " + e.getMessage(), e);
                ie.setStackTrace(EMPTY_STACK_TRACE);
                throw ie;
            } finally {
                // Don't retain static reference on context.
                mConstructorArgs[0] = lastContext;
                mConstructorArgs[1] = null;

                Trace.traceEnd(Trace.TRACE_TAG_VIEW);
            }

            return result; //返回结果
        }
    }

总结

  • 调用LayoutInflater.from(this).inflate(resource,null)不会将resource添加到布局中,结果返回resource资源根布局view,但不会设置对应的父布局LayoutParams属性【resource布局文件最外层的layout_width和layout_height等跟父布局有关的位置属性都会失效】;

  • 调用LayoutInflater.from(this).inflate(resource,root)会将resource添加到root布局中,同时会设置对应的父布局LayoutParams属性,结果返回root本身;

  • 调用LayoutInflater.from(this).inflate(resource,root,true)LayoutInflater.from(this).inflate(resource,root)方法效果一致,结果返回root本身;

  • 调用LayoutInflater.from(this).inflate(resource,root,false)不会将resource添加到root中,结果返回resource资源根布局view,同时会设置对应的父布局LayoutParams属性

  • 下面代码效果相同;

LayoutInflater.from(this).inflate(resource,root)
等同于
LayoutInflater.from(this).inflate(resource,root,true)
等同于
View resourceView = LayoutInflater.from(this).inflate(resource,root,false)
root.addView(resourceView)

结语

如果以上文章对您有一点点帮助,希望您不要吝啬的点个赞加个关注,您每一次小小的举动都是我坚持写作的不懈动力!ღ( ´・ᴗ・` )文章来源地址https://www.toymoban.com/news/detail-636358.html

到了这里,关于对于LayoutInflater.from(this).inflate()方法的理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 文心一言对于宣传文案理解

    前段时间对于文心一言开放部分内测邀请,有幸获得邀请内测权限!抱着试一试的态度对其进行了使用,结果还是比较满意的。我们来看一下我所说的满意是否能够达到你的要求!!! 文心一言的使用还是比较简单的,只需要在对话框中输入你的描述,发送到百度,即可收到

    2024年02月13日
    浏览(38)
  • 对于计算机视觉的一定理解

    计算机视觉(CV)技术是一种通过计算机对图像或视频进行处理和理解的技术。它利用算法和模型来模仿人类视觉系统,从而实现图像识别、目标检测、图像分割等任务。以下是计算机视觉技术的一些优势和挑战的例子。 计算机视觉的应用方面非常广泛,包括但不限于以下几

    2024年02月19日
    浏览(44)
  • 关于python from .. import .. 以及 pycharm对于source root bug的一个通用解决方案

    先说问题         python里默认from .. import .. 这个写法的from会查找当前文件夹下但 不包含当前文件夹 的路径,也就是说 如果from ..的这里写入的是当前文件夹 是会报错的,因为无法找到当前文件夹。 尝试的坑            pycharm的source root。这个是真的坑啊。加了source ro

    2024年02月11日
    浏览(41)
  • 对于Java中String的简单理解

          String变量的本质:在堆上申请一块空间创建字符串,并让指针指向这块空间。 String变量发生改变(赋值),原指向的字符串空间不会被释放,而是重新申请一块空间创建字符串,并让指针指向这块空间。由于Java拥有自动内存管理机制,因此在程序运行结束或堆空间

    2024年02月12日
    浏览(44)
  • 我这些年对于自动化测试的理解

    把以人为驱动的测试行为转化为机器执行的一种过程。 简单讲:比如使用自动化测试框架、脚本、工具等自动打开测试对象(引用),自动去执行测试用例(此过程中包含自动化查找元素、控件等),自动输入测试数据、自动生成测试报告等一系列的自动化过程; 通俗讲:

    2024年02月05日
    浏览(49)
  • 对于装饰器模式与代理模式的个人理解

    对于这两个十分接近的设计模式,确实容易产生困惑,代理模式和装饰器模式看起来十分相似,都是由两个类实现相同的接口,然后一个类套另一个类。这件事足足困扰了我5分钟之久,在此总结一下它们的差别。 装饰器模式相当于主动可选的代理模式,是对原本功能的拓展

    2024年02月16日
    浏览(32)
  • 对于<router-view>标签的理解

    router-view的含义: router-view: 路由容器 Vue 路由中的 router-view 是用来承载当前级别下的子级路由的一个视图标签; 此标签的作用就是显示当前路由级别下一级的页面。 router-view的作用: 就比如说App.vue是根组件,在它的template标签里使用router-view,而且配置好路由的情况下,就

    2024年01月17日
    浏览(39)
  • 对于params、data、headers传参的基础理解

    提示:简单的理解, 传参给后台有三种方式: 1. params 传参 2. data 传参 3. headers 传参 params 的对象参数名和值, axios 源码会把参数和值,拼接在 url? 后面给后台(query 查询字符串) 代码如下:前台 data 的对象参数名和值,axios 源码会把参数和值,拼接在请求体里(body 参数)

    2024年02月06日
    浏览(46)
  • 对于EVM系链交易缓冲池txpool的理解

    区块链就是和交易打交道,我们今天就介绍下,交易处理过程中的一个重要组成部分:txpool。这篇文章主要从功能角度介绍,通过这篇文章会了解: txpool的在交易中的位置和作用。 txpool的功能,核心组成部分queued和pending。 txpool如何实现它的功能。 txpool源码的重要关注点。

    2024年02月05日
    浏览(39)
  • c++ std::enable_shared_from_this作用

    std::enable_shared_from_this 是一个类模板,用来返回指向当前对象的shared_ptr智能指针。在说明它的作用前我们可以看一下如下代码: demo.cpp 类 A 中有一个函数 getSharedPtr() 函数,用来返回指向当前对象的一个shared智能打针。其实就是用 this 构造了一个智能指针进行返回,执行结果

    2023年04月23日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包